Docker和fcntl OSError Errno 22无效参数

时间:2019-10-22 14:23:56

标签: python linux docker ubuntu fcntl

我遇到了一个奇怪的问题,我不知道如何进行。

我有docker 18.09.2,在运行Ubuntu 18.04的VMware ESXi 6.5虚拟机上构建6247962。我有docker 19.03.3,在运行Ubuntu 18.04的Azure虚拟机上构建了a872fc2f86。我在主机和不同的Docker容器中都运行以下测试脚本:

#!/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 18.09.2的VM上使用上述Dockerfile创建了一个docker映像,则以上内容将为我提供与主机相同的结果。

如果我在运行docker 19.03.3的VM上使用上述Dockerfile创建了docker映像,则上面的错误给我以下提示:

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

我比较了主机之间的docker目录结构,daemon.json文件,日志和“ docker信息”。它们看起来是相同的。我尝试使用FROM ubuntu:18.04和ubuntu:19.04。我已经尝试使用python2和python3了。结果相同。

我不知道为什么fcntl仅在运行docker 19.03.3。的Azure VM上的docker容器上失败码头工人在18到19之间有什么变化可能导致了这种情况吗?我需要进行一些配置更改才能使其正常工作吗?我还想念其他东西吗?

任何帮助将不胜感激。

谢谢

刘易斯·穆伦坎普


UPDATE01:
我正在按照here的步骤准备自己的自定义Ubuntu 18.04 VHD,以在Azure中使用。我首先使用从Ubuntu网站下载的ubuntu-18.04.3-live-server-amd.iso进行了Ubuntu Server 18.04的常规安装。下面的测试在刚安装的虚拟机上可以正常工作。我完成了这一步

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

,然后我的测试失败。因此,我认为这些硬件启用包存在一些问题。

1 个答案:

答案 0 :(得分: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")