ADD 和 COPY 区别
如果 <源路径>
为一个 tar
压缩文件的话,压缩格式为 gzip
, bzip2
以及 xz
的情况下,ADD
指令将会自动解压缩这个压缩文件到 <目标路径>
去。
在某些情况下,这个自动解压缩的功能非常有用,比如官方镜像 ubuntu
中:
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
...
但在某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用 ADD
命令了。
在 Docker 官方的Dockerfile 最佳实践文档中要求,尽可能的使用 COPY
😄,因为 COPY
的语义很明确,就是复制文件而已,而 ADD
则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD
的场合,就是所提及的需要自动解压缩的场合。
另外需要注意的是,ADD
指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
CMD 和 ENTRYPOINT 区别
仅在使用
docker run
时有区别,容器运行起来后使用docker exec
时没有区别。
CMD
想增加参数-i
的话,还需要把完整命令再写一遍
|
|
|
|
ENTRYPOINT
可以直接在docker run
后面增加参数,docker 会进行追加操作
|
|
docker run myip -i
等价于 curl -s http://myip.ipip.net -i
|
|
ARG 和 ENV 区别
ARG
格式:ARG <参数名>[=<默认值>]
构建参数和 ENV
的效果一样,都是设置环境变量。所不同的是,ARG
所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG
保存密码之类的信息,因为 docker history
还是可以看到所有值的。
Dockerfile
中的 ARG
指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build
中用 --build-arg <参数名>=<值>
来覆盖。
灵活的使用 ARG
指令,能够在不修改 Dockerfile 的情况下,构建出不同的镜像。
ARG 指令有生效范围,如果在 FROM
指令之前指定,那么只能用于 FROM
指令中。
|
|
使用上述 Dockerfile 会发现无法输出 ${DOCKER_USERNAME}
变量的值,要想正常输出,你必须在 FROM
之后再次指定 ARG
|
|
|
|
ENV
格式有两种:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENV
设置的环境变量在镜像构建
和容器运行
过程中都有效。