我遇到了一个奇怪的问题,我不知道如何进行。
我有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
,然后我的测试失败。因此,我认为这些硬件启用包存在一些问题。
答案 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")