我认为有两种方法可以在Dockerfile中安装某些依赖项:
1)在Dockerfile中:
RUN yum install xxx
2)在脚本install.sh和Dockerfile中放入“ yum install xxx”
RUN ./install.sh
两者似乎都在起作用,只是徘徊比任何一个都更好?
答案 0 :(得分:1)
您负担得起的选择几乎没有区别。如果您坚持,我可以告诉您一些细微差别:
1。两张图片的输出具有不同的层数,并且尺寸差异很小:
接下来是一个简单的示例:
Dockerfile:
FROM centos:7
RUN yum install -y net-tools
构建命令:
$ docker build -t trial:1 . --no-cache
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的应用程序的过程。