启动容器之前,将主机系统中的文件复制到Docker镜像

我试图在容器内build立RPM,然后使用docker cp命令将这些RPM复制到主机。

现在,我需要在second容器中安装这些RPM。 我可以简单地执行docker cp将文件复制到正在运行的second容器中。

但是,问题是我试图拉图像,执行一个命令(不是我写的), 运行docker容器,运行容器内的各种命令,并删除容器 。 由于这一步是自动的,我不能运行容器,然后复制文件。 我必须预先加载RPM到我已经拉的图像。 有没有办法做到这一点?

有两种方式,涉及创build一个新的形象。

  1. 基于像FROM image_name:tag那样的基础图像构build另一个图像。 在RUN指令中运行所需的命令。 然后你可以运行容器。 这是更干净的方式。
  2. 使用docker create创build容器,使用docker run使用确切的参数,然后使用docker commit使用-c (– --change )选项创build一个新镜像,如下所示: docker commit -c 'RUN yum install ... container_name image_name

一个ENTRYPOINT丑陋的方法是用一个脚本来绕过ENTRYPOINTCMD命令,然后运行默认的ENTRYPOINT和/或CMD命令。

Docker在17.05年增加了多阶段构build。 https://docs.docker.com/engine/userguide/eng-image/multistage-build/

使用这个特性,你可以在第二个Dockerfile的顶部有一个额外的FROM行,第一个图像包含第一个图像。 然后,进一步运行复制命令,将rpm文件从第一阶段复制到第二阶段以进行testing。 如果这需要澄清,让我知道,我明天到办公室后会举一个例子。


以下是Dockerfile工作stream程示例:

 FROM first_image:latest as rpmsource FROM second_base_image:latest COPY --from=rpmsource /path/in/first_image/*.rpm /path/in/second_image/ CMD ["/script/that/does_stuff_with_rpms.sh"] 

两条FROM线是多阶段构build,至less需要17.05。 生成的图像将只包含最后一个图像,除非你build立一个特定的目标(请参阅docker build --target选项了解更多细节)。 带有--from行的COPY命令可以从后面的FROM复制文件。