ENTRYPOINT和CMD
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。
1、支持格式
ENTRYPOINT的两种格式
The exec form:
ENTRYPOINT ["executable", "param1", "param2"]
The shell form:
ENTRYPOINT command param1 param2 命令行模式相当于: ["/bin/sh", "-c", "command", "param1", "param2"]
当shell模式时,CMD和docker run后面的指令传不进来。
CMD的三种格式
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form) 命令行模式相当于:["/bin/sh", "-c", "command", "param1", "param2"]
2、覆盖方式不同
docker run后面的指令会覆盖掉CMD。
docker run时使用参数--entrypoint覆盖掉ENTRYPOINT,如docker run --entrypoint /bin/bash
3、当同时存在ENTRYPOINT和CMD时
1、当存在ENTRYPOINT时且为shell格式时,CMD和docker run后面的命令无效。
2、当存在ENTRYPOINT时且为exec格式时,CMD或docker run 后面的指令作为ENTRYPOINT的参数使用
docker run后面的指令相当于CMD exec格式。
当CMD为exec格式时:
ENTRYPOINT ["echo"]
+
CMD ["echo", "hello"]
= echo echo hello
命令行打印:echo hello
CMD为shell格式时:
ENTRYPOINT ["echo"]
+
CMD echo hello = ["/bin/sh", "-c", "echo", "hello"]
= echo /bin/sh -c echo hello
命令行打印:
/bin/sh -c echo hello
ADD和COPY
ADD和COPY都是从build context 复制文件或目录到镜像,不同的是,如果复制的是压缩包时,ADD会自动解压。