在Docker映像中从DVD存储库安装软件包
我试图建立一个Docker映像,需要从DVD iso安装一些软件包,但我无法在容器中安装iso 我的Dockerfile是:在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 && \
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"]