我尝试在容器first
中构建RPM,然后使用docker cp
命令将这些RPM复制到主机。
现在,我需要在second
容器中安装这些RPM。我可以简单地docker cp
将文件复制到正在运行的second
容器中。
但是,问题是我试图拉动图像,执行命令(不是由我编写) 运行docker容器,在容器内运行各种命令并移除容器 即可。由于此步骤是自动执行的,因此我无法运行容器,然后复制该文件。我必须将RPM预加载到我已经拉过的图像中。有没有办法实现这个目标?
答案 0 :(得分:1)
有两种方法,包括创建新图像。
FROM image_name:tag
等基本图像构建另一个图像。在RUN
指令中运行所需的命令。然后你可以运行容器。这是更清洁的方式。docker create
创建包含您使用docker run
时使用的确切参数的容器,然后使用docker commit
-c
创建一个--change
的新图片}}选项如下:docker commit -c 'RUN yum install ... container_name image_name
。一种hackish和丑陋的方式是绕过ENTRYPOINT
和CMD
命令,使用一个执行所需操作的脚本,然后运行默认的ENTRYPOINT
和/或{{1} }命令。
答案 1 :(得分:0)
Docker在17.05中添加了多阶段构建。 https://docs.docker.com/engine/userguide/eng-image/multistage-build/
使用此功能,您可以在第二个Dockerfile的顶部添加一条FROM
行,其中包含第一个图像作为第一个阶段。然后进一步运行复制命令,将rpm文件从第一阶段复制到第二阶段进行测试。如果这需要澄清,请告诉我,明天我到办公室时会发一个例子。
以下是Dockerfile工作流程示例:
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
行是一个多阶段构建,需要至少17.05才能构建。除非您构建特定目标,否则生成的图像将仅包含最后一个图像(有关详细信息,请参阅docker build --target
选项)。带COPY
行的--from
命令可以复制后来的FROM
文件。