基于scratch的docker容器中的多个二进制文件

时间:2017-08-14 15:46:51

标签: docker dockerfile

我有一个容器的规范,需要一个接一个地执行两个二进制文件。我更喜欢从暂存图像继承,以便容器不大于两个可执行文件的总和。实现这一目标的显而易见的方法是从高山或其他一些小型操作系统继承,但我更喜欢划痕。此外,Dockerfile中的CMD,RUN和EXEC命令似乎需要一个shell,因此不能选择临时。建造两个集装箱然后建造一个码头群是很有趣但不是答案。

1 个答案:

答案 0 :(得分:0)

我不完全确定这里的问题是什么,所以这里有一些想法。

首先,你是正确的RUN需要一个shell,但它听起来并不像你需要的那样。您有两个二进制文件,我们会调用file1file2,您只需要将它们复制到您的图像中:

FROM scratch
COPY file1 /file1
COPY file2 /file2

如果您只想运行单个可执行文件,那么您的生活将变得简单。 CMD不需要shell,因此您只需添加:

CMD ["/file1"]

使用CMD的JSON版本意味着二进制文件将在没有shell的情况下执行。

虽然运行单个命令很简单,但是您希望按顺序运行两个不同的命令意味着您需要某些来处理该工作流程。最简单的解决方案是shell,因为那样你就可以运行:

CMD /file1;/file2

但如果你不想想要一个shell,那么你需要编写一个第三个​​二进制文件来处理执行第一个命令,等待它完成,然后执行第二个。这将使您的整个Dockerfile看起来像:

FROM scratch
COPY file1 /file1
COPY file2 /file2
COPY file3 /file3
CMD ["/file3"]

除非您计划在一些异常空间受限的环境中进行部署,否则使用alpine图像或类似图像可能会花费更多时间。

<强>更新

因为它出现在评论中:

使用-e--env-file不会对容器施加任何特殊要求。例如,我们可以生成一个只包含/usr/bin/env命令的容器(以及必要的共享库);完整的图像源看起来像:

Dockerfile
lib64/libc.so.6
lib64/ld-linux-x86-64.so.2
usr/bin/env

看起来像Dockerfile

FROM scratch
COPY . /
ENTRYPOINT ["/usr/bin/env"]

包含以下内容的文件bar.env

BAR=somevalue

假设我们构建一个名为&#34; testenv&#34;的容器,我们可以运行:

docker run -e FOO=bar --env-file bar.env testenv

见:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f8f43505a272
BAR=somevalue
FOO=bar
HOME=/root