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