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

时间:2018-09-03 14:36:51

标签: 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 && \
    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,但日志显示它返回了代码= 1。

这是从Docker中的DVD安装软件包的正确方法吗?

1 个答案:

答案 0 :(得分:0)

通常,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”是定义更好的操作。