Docker и fcntl OSError Errno 22 Недопустимый аргумент

Я столкнулся со странной проблемой, и я не знаю, как поступить.

У меня есть докер 18.09.2, сборка 6247962 на виртуальной машине VMware ESXi 6.5 под управлением Ubuntu 18.04. У меня есть докер 19.03.3, соберите a872fc2f86 на виртуальной машине Azure под управлением Ubuntu 18.04. У меня есть следующий небольшой тестовый скрипт, который я запускаю на обоих хостах и ​​в разных док-контейнерах:

#!/usr/bin/python3

import fcntl
import struct

image_path = 'foo.img'

f_obj = open(image_path, 'rb')
binary_data = fcntl.ioctl(f_obj, 2, struct.pack('I', 0))
bsize = struct.unpack('I', binary_data)[0]
print('bsize={0}'.format(bsize))
exit(0)

Я запускаю «ps -ef >foo.img», чтобы получить файл foo.img. Вывод вышеуказанного скрипта на обеих виртуальных машинах: bsize=4096.

У меня есть следующий Dockerfile на обеих виртуальных машинах:

FROM ubuntu:19.04

RUN apt-get update && \
    apt-get install -y \
        python \
        python3 \
        vim

WORKDIR /root
COPY testfcntl01.py foo.img ./
RUN chmod 755 testfcntl01.py

Если я создам образ Docker с указанным выше файлом Dockerfile на виртуальной машине, на которой работает docker 18.09.2, это даст мне те же результаты, что и хост.

Если я создам образ докера с указанным выше файлом Dockerfile на виртуальной машине, на которой работает докер 19.03.3, это выдаст мне следующую ошибку:

root@d317404714a6:~# ./testfcntl01.py
Traceback (most recent call last):
  File "./testfcntl01.py", line 9, in <module>
    binary_data = fcntl.ioctl(f_obj, 2, struct.pack('I', 0))
OSError: [Errno 22] Invalid argument

Я сравнил структуру каталогов докера, файл daemon.json, журналы, «информацию о докере» между хостами. Они кажутся идентичными. Я пробовал с Ubuntu: 18.04, а также с Ubuntu: 19.04. Я пробовал как с python2, так и с python3. Те же результаты.

Я не знаю, почему fcntl дает сбой только в контейнере докеров на виртуальной машине Azure, на которой работает докер 19.03.3. Что-то изменилось в докере между 18 и 19, что могло вызвать это? Есть ли какое-то изменение конфигурации, которое мне нужно сделать, чтобы заставить это работать? Что-то еще мне не хватает?

Любая помощь будет принята с благодарностью.

Спасибо

Льюис Мюленкамп


ОБНОВЛЕНИЕ01:
Я выполнял шаги здесь, чтобы подготовить собственный виртуальный жесткий диск Ubuntu 18.04 для использования в Azure. Я начал с обычной установки Ubuntu Server 18.04 с использованием ubuntu-18.04.3-live-server-amd.iso, который я только что скачал с веб-сайта Ubuntu. Приведенный ниже тест отлично работает на только что установленной виртуальной машине. я заканчиваю шаг

sudo apt-get install linux-generic-hwe-18.04 linux-cloud-tools-generic-hwe-18.04

и тогда мой тест терпит неудачу. Итак, я считаю, что есть некоторые проблемы с этими пакетами поддержки оборудования.


person Lewis M    schedule 22.10.2019    source источник


Ответы (1)


У меня была довольно похожая ошибка, и я обнаружил, что если файл находится в смонтированном томе, по крайней мере, принадлежащем хосту, он не выйдет из строя. То есть:

docker run -it -v $PWD:/these_work ubuntu:18.04 bash

Файлы в каталоге /these_work в контейнере работали, однако другие файлы, которые были доступны только из контейнера, приводили к ошибке [Errno 22] Invalid Argument.

Я пришел сюда из-за ошибки сборки yocto из почти идентичного метода доступа к размеру блока в filemap.py:

# Get the block size of the host file-system for the image file by calling
# the FIGETBSZ ioctl (number 2).
try:
    binary_data = fcntl.ioctl(file_obj, 2, struct.pack('I', 0))
except OSError:
    raise IOError("Unable to determine block size")
person ibuntu    schedule 05.02.2021
comment
Я обнаружил, что смонтированный том не обязательно должен быть общим с хостом, это может быть просто том докера (для меня это было неясно из ответа). Также я обнаружил, что если я монтирую этот том в непустой каталог в контейнере, Docker автоматически сохраняет содержимое каталога в этот том, так что мне не нужно вносить никаких дополнительных изменений в контейнер и все работает. Спасибо за обходной путь! - person klasyc; 18.03.2021