在Docker映像中从DVD存储库安装软件包

在Docker映像中从DVD存储库安装软件包,docker,mount,Docker,Mount,我试图建立一个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 && \

我试图建立一个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安装软件包的正确方法吗?

通常,Docker容器无法访问主机设备,不应装载其他文件系统。这些限制在
docker build
序列期间更为严格,因为您无法使用各种选项来规避这些限制

最简单的方法是编写一个包装器脚本,为您执行装载和卸载操作,如:

#!/bin/sh
if [ ! -d tools ]; then mkdir tools; fi
mount -r tools.iso tools
docker build "$@" .
umount tools
然后,您可以有一个两阶段的Docker映像,其中第一阶段可以访问整个DVD内容并运行其安装程序,第二阶段实际构建您想要运行的映像。这看起来有点像(完全假设)

明显的问题是,DVD的全部内容将通过网络通道从主机发送到自身,作为
docker build
序列的一部分,然后在
COPY
步骤中再次复制;如果它真的进入千兆字节范围,那么它就开始变得笨拙。您可以使用
.dockrignore
文件隐藏其中的一部分,以稍微加快速度


取决于软件是什么,您还应该考虑它是否可以在DOCKER容器中成功运行(它是否期望运行具有相当刚性的通信模式的多个服务)?虚拟机可能是一个更好的部署选项,而“将DVD装载到VM”是一个更好的定义操作。

感谢您的回复,我将尽快测试您的解决方案。然而,你为什么建议采用两阶段的形象?在这种情况下有哪些好处?关于您的最后一个问题,不,这是一项简单的服务:我的问题与“如何使用DVD repo运行
yum install
”有关。我假设DVD上的内容是“大的”,但与实际安装的内容完全冗余。在这种情况下,两阶段构建可以避免在实际使用的映像中出现第二个副本
yum
使这一点变得有点棘手,因为您无法将安装的软件包真正隔离到一个可以复制的目录中;另一方面,您只能复制需要安装的特定
.rpm
文件。
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"]