The exec form, which is the preferred form:
ENTRYPOINT ["executable", "param1", "param2"]
The shell form:
ENTRYPOINT command param1 param2
请注意
exec表单被解析为JSON数组,这意味着必须在单词周围使用双引号(")而不是单引号(')。
与shell表单不同,exec表单不调用命令shell。这意味着正常的shell处理不会发生。例如,ENTRYPOINT ["echo", "$HOME"]不会对$HOME进行变量替换。如果需要shell处理,那么要么使用shell形式,要么直接执行shell,例如:ENTRYPOINT ["sh", "-c", "echo $HOME"]。当使用exec表单并直接执行shell时(就像使用shell表单一样),是shell执行环境变量展开,而不是docker。
示例:
vim Dockerfile
FROM ubuntu
ENTRYPOINT ["top","-o","%MEM"]
通过上面的运行结果可以看出,docker run命令指定的容器运行命令不能覆盖Dockerfile文件中ENTRYPOINT指令指定的命令,反而被当做参数传递给ENTRYPOINT指令指定的命令之后
docker运行的命令行参数将被附加在执行表单ENTRYPOINT的所有元素之后,并将覆盖使用CMD指定的所有元素。
vim Dockerfile
FROM ubuntu
ENTRYPOINT ["top","-p","1"]
CMD ["-o","%MEM"]
docker build -t ubuntu:t7 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu
---> 1318b700e415
Step 2/3 : ENTRYPOINT ["top","-p","1"]
---> Using cache
---> 2648b9534628
Step 3/3 : CMD ["-o","%MEM"]
---> Running in d0496db85c77
Removing intermediate container d0496db85c77
---> c3c934e21488
Successfully built c3c934e21488
Successfully tagged ubuntu:t7
docker run -it ubuntu:t7 | grep "load average"
top - 10:15:32 up 8:01, 0 users, load average: 0.39, 0.62, 0.77
如果使用CMD为ENTRYPOINT指令提供默认参数,则应使用JSON数组格式指定CMD和ENTRYPOINT指令
vim Dockerfile
FROM ubuntu
ENTRYPOINT ["top","-p","1"]
CMD ["-o","%MEM"]