我正在尝试构建一个Docker镜像,它需要从DVD iso安装一些包,但我无法将iso挂载到容器中。
我的Dockerfile是:
FROM registry.access.redhat.com/rhscl/devtoolset-7-toolchain-rhel7:latest
USER root
WORKDIR /home
COPY tools.iso ./
COPY tools.repo /etc/yum.repos.d/
RUN mkdir /mnt/tools && \
mount -r ./tools.iso /mnt/tools && \
yum -y install make && \
umount /mnt/tools && \
rm tools.iso
CMD /bin/bash
当我运行docker build
时,它返回以下错误:
mount: /home/tools.iso: failed to setup loop device: No such file or directory
我还试图在安装iso之前添加命令modprobe loop
,但日志显示它返回了code=1。
这是在Docker中从DVD安装包的正确方式吗?
发布于 2018-09-04 07:55:54
一般来说,Docker容器不能访问主机设备,也不应该挂载额外的文件系统。在docker build
序列期间,这些限制甚至更严格,因为您不能使用各种选项来规避它。
最直接的选择是编写一个包装器脚本,为您执行挂载和卸载,如下所示:
#!/bin/sh
if [ ! -d tools ]; then mkdir tools; fi
mount -r tools.iso tools
docker build "$@" .
umount tools
然后,您可以拥有一个包含两个阶段的Docker映像,其中第一个阶段可以访问整个DVD内容并运行其安装程序,而第二个阶段实际上构建了您想要运行的映像。它看起来就像(完全是假设的)
FROM registry.access.redhat.com/rhscl/devtoolset-7-toolchain-rhel7:latest AS install
COPY tools tools
RUN cd tools && ./install.sh /opt/whatever
FROM registry.access.redhat.com/rhscl/devtoolset-7-toolchain-rhel7:latest
COPY --from=install /opt/whatever /opt
EXPOSE 8888
CMD ["/opt/whatever/bin/whateverd", "--bind", "0.0.0.0:8888", "--foreground"]
这样做的明显问题是,作为docker build
序列的一部分,DVD的全部内容将通过网络通道从主机发送到它自己,然后在COPY
步骤期间再次复制;如果它确实进入千兆字节范围,那么这将开始变得笨拙。您可以使用.dockerignore
文件来隐藏其中的一些文件,以稍微加快速度。
根据软件是什么,您还应该考虑它是否可以在Docker容器中成功运行(它是否期望以相当严格的通信模式运行多个服务?);虚拟机可能被证明是更好的部署选项,而“将DVD挂载到VM”是一个定义更好的操作。
https://stackoverflow.com/questions/52151842
复制相似问题