Docker-在Dockerfile或外部Shell脚本中安装东西

时间:2019-07-11 16:42:01

标签: docker dockerfile

我认为有两种方法可以在Dockerfile中安装某些依赖项:

1)在Dockerfile中:

RUN yum install xxx 

2)在脚本install.sh和Dockerfile中放入“ yum install xxx”

RUN ./install.sh 

两者似乎都在起作用,只是徘徊比任何一个都更好?

3 个答案:

答案 0 :(得分:1)

您负担得起的选择几乎没有区别。如果您坚持,我可以告诉您一些细微差别:

1。两张图片的输出具有不同的层数,并且尺寸差异很小:

接下来是一个简单的示例:

选项1:

Dockerfile:

FROM centos:7
RUN yum install -y net-tools

构建命令:

$ docker build -t trial:1 . --no-cache

选项2:

Dockerfile:

FROM centos:7
ADD install.sh .
RUN ./install.sh

install.sh:

yum install -y net-tools

构建命令:

$ docker build -t trial:2 . --no-cache

比较:

$ docker history trial:1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f86f153f9d95        12 minutes ago      |0 /bin/sh -c yum install -y net-tools          105MB
9f38484d220f        3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:074f2c974463ab38c…   202MB

$ docker history trial:2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
775be0061903        10 minutes ago      |0 /bin/sh -c ./install.sh                      105MB
b7ca1d2a7e8b        10 minutes ago      /bin/sh -c #(nop) ADD file:6f96562be8deac728…   25B
9f38484d220f        3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:074f2c974463ab38c…   202MB

从上面可以看到,如果您使用./install.sh,则必须在ADD中有一条Dockerfile指令。与选项1相比,它将为最终生成的图像增加约20B的图像层。

2。图片最大层数限制:

请参阅this discussion,泊坞窗图像层的最大数量为127,因此,如果您处于特殊情况下,基础图像或您的图像已经使用了太多层,则可能会有帮助。

3。从主机到容器复制文件的效率:

ADD需要将文件从Docker主机复制到容器。在内部,docker build将创建上下文目录的tar文件,并将其发送到docker守护程序并解压缩。因此,问题在于,如果我们可以直接在Dockerfile中做到这一点,为什么我们需要它?

但是您真的在乎20B,一层又一层的COPY速度吗?我想除非在一些非常裸露的情况下,否则这两个选项没有区别。

但是,put package install directly in Dockerfile似乎是大多数人的选择,因为人们可能会问,如果install.sh并没有给我带来任何好处,我为什么会努力保持它。

答案 1 :(得分:0)

Docker将为Instruction上的每个Dockerfile创建一个图像,但是如果已经使用该Instruction创建了图像,它将使用该图像代替。

因此,当您在Instructions上有多个Dockerfile来创建图像时,以减少中间图像数量的方式来组织Instructions是很重要的。

所以我认为,如果将所有Instructions放在一个文件中,则中间图像可能会更少。但也请注意,该文件中的任何将来更改都将导致创建新的中间映像,因为尚未使用任何创建的中间映像,这会使映像创建时间变慢。

答案 2 :(得分:0)

如果您要构建docker映像,请在Dockerfile中使用以下内容,而不要使用脚本来安装软件包及其依赖项。

运行yum -y更新&& \     yum -y install .. && \     百分百干净

使用自定义外壳脚本在Dockerfile中的ENTRYPOINT内部运行应用程序特定的服务。

按照说明在一个RUN命令中添加/安装软件包,以减少中间映像层。

使用shell脚本安装非容器映像/非docker映像的软件包及其依赖项是很好的做法,以自动化基于VM的应用程序的过程。