Dockerfile 里的 COPY ADD RUN CMD E
总体来说, COPY,ADD,RUN 都是增加镜像层(不一定会,要看缓存情况)。
CMD 和ENTRYPOINT 用于配制容器为像一个执行文件
COPY & ADD
COPY . /src
新建一个镜像层,把文件拷贝进去
如果这条命令已经缓存了,Docker 会继续查找同样基于上一层镜像的执行了 COPY . /src
命令的镜像。
还有 COPY 和 ADD 还会检查复制的文件 Checksum 值,如果文件发生了改变也会设置混存无效。
在执行 Dockerfile 构建镜像的过程中一旦某一行命令出现缓存无效,之后的都不使用缓存 所以尽可能将发生改变的命令放在 Dockerfile 文件下面
ADD <url> <dest>
ADD 可以将 Host 以外的文件,或者 tar 压缩包(解压后)当到 容器内。
如果只是拷贝目录,用 COPY
RUN,CMD 和 ENTRYPOINT
设置容器启动默认执行到动作,或者参数。
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo", "Hello world"]
RUN
创建一个镜像层
shell 模式顾名思义就是在 shell 里执行,exec 模式就是可执行文件绝对路径加参数。
区别于 CMD 和 ENTRYPOINT RUN命令的作用是增加一个景象层
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
把 update 写在一个RUN里是为了防止命中之前的 RUN apt-get update
缓存,那就不会创建一个新的镜像层,也就等于没有执行更新动作了。
RUN 运行方式
-
RUN <command> (shell form)
-
RUN ["executable", "param1", "param2"] (exec form)
CMD
-
定义默认的容器启动命令,
-
或者为 exec 模式的 ENTRYPOINT 提供参数
第一点很好理解,docker run -it <image>
会执行 Dockerfile 里面的 CMD,
如果给出了command 如 docker run -it <image> <command>
Dockerfile 里的CMD命令就会被忽略。
CMD 有三种模式:
CMD ["executable","param1","param2"] (exec form, preferred)
CMD ["param1","param2"] (sets additional default parameters for ENTRYPOINT in exec form)
CMD command param1 param2 (shell form)
ENTRYPOINT
ENTRYPOINT 用来将容器变得像一个可执行文件
ENTRYPOINT 两种运行方式
- exec 模式的 ENTRYPOINT 跟 CMD 的区别是它可以接受来自 CMD 传递的参数,或者
docker run -it <image> 参数
里的参数。注意docker run
里的参数会覆盖CMD里的。 - Shell 方式会忽略CMD 以及
docker run -it <image> 参数
里的参数