启动容器之前,将主机系统中的文件复制到Docker镜像
我试图在容器内build立RPM,然后使用docker cp
命令将这些RPM复制到主机。
现在,我需要在second
容器中安装这些RPM。 我可以简单地执行docker cp
将文件复制到正在运行的second
容器中。
但是,问题是我试图拉图像,执行一个命令(不是我写的), 运行docker容器,运行容器内的各种命令,并删除容器 。 由于这一步是自动的,我不能运行容器,然后复制文件。 我必须预先加载RPM到我已经拉的图像。 有没有办法做到这一点?
有两种方式,涉及创build一个新的形象。
- 基于像
FROM image_name:tag
那样的基础图像构build另一个图像。 在RUN
指令中运行所需的命令。 然后你可以运行容器。 这是更干净的方式。 - 使用
docker create
创build容器,使用docker run
使用确切的参数,然后使用docker commit
使用-c
(–--change
)选项创build一个新镜像,如下所示:docker commit -c 'RUN yum install ... container_name image_name
。
一个ENTRYPOINT
丑陋的方法是用一个脚本来绕过ENTRYPOINT
和CMD
命令,然后运行默认的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
复制文件。