dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT)

ADD和COPY

两者都是将文件从宿主机拷贝到docker容器里面,ADD更为强大,如果拷贝的是个压缩包会自动解压,但一般常用的COPY

CMD和ENTRYPOINT

两者都是容器启动时执行的命令,不同的是一个是覆盖原有命令,一个是在原有命令上追加

CMD

docker run 之后加的参数,如果是CMD,会直接覆盖掉原有CMD命令,变为参数

//dockerfile

....

CMD ["cd /tmp"]
docker run image  //会直接执行cd /tmp命令到tmp目录
docker run image cd /usr   //这个命令会将dockerfile中的命令覆盖掉,目录会到usr

ENTRYPOINT

docker run 后面追加参数的话,不会覆盖原有dockerfile中的命令,而是在后面追加

//dockerfile

....

ENTRYPOINT ["cd /tmp"]
docker run image  //会直接执行cd /tmp命令到tmp目录
docker run image cd /usr   //会先cd到tmp,再cd到usr

当CMD和ENTRYPOINT同时存在时

ENTRYPOINT和CMD两个命令的先后顺序无关;

当ENTRYPOINT使用shell语法时,无论CMD使用什么语法以及docker run有没有附加command,都只执行ENTRYPOINT

//情况一
ENTRYPOINT echo "e"
CMD echo "c"

docker run不附加command //输出 e
docker run附加command(echo "hi") //输出 e

//情况二
ENTRYPOINT echo e
CMD ["echo","c"]

docker run不附加command //输出结果: e
docker run附加command(echo "hi")//输出结果: e

当ENTRYPOINT使用可执行文件加参数的语法时,分两种情况:

docker run没有附加command:无论CMD使用什么语法,CMD指令的内容会作 为参数传递给ENTRYPOINT;

//情况一
ENTRYPOINT ["echo","e"]
CMD echo "c"

docker run不附加command  //输出结果: e /bin/sh -c echo c

//情况二
ENTRYPOINT ["echo","e"]
CMD ["echo","c"]

docker run不附加command  //输出结果: e echo c

docker run附加了command:无论CMD使用什么语法,CMD指令会被docker run 中的command覆盖,command作为参数传递给ENTRYPOINT。

//情况一
ENTRYPOINT ["echo","e"]
CMD echo "c"

docker run附加command(echo “hi”)  //输出结果: e  echo hi

//情况二
ENTRYPOINT ["echo","e"]
CMD ["echo","c"]

docker run附加command(echo “hi”)  //输出结果: e echo hi

你可能感兴趣的:(dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT))