shell格式和Exec格式运行命令
我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:
- Shell格式: 。例如:apt-get install python3
- Exec格式: [“executable”, “param1”, “param2”, …]。
例如: [“apt-get”, “install”, “python3”]
一.CMD
1.定义
设置容器启动后默认执行的命令和参数
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)
- 第一种用法:运行一个可执行的文件并提供参数。
- 第二种用法:为ENTRYPOINT指定参数。
- 第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令
2.例子
创建Dockerfile文件,内容如下:
FROM ubuntu
ENV name lss0555
CMD echo "hello $name"
创建镜像:
docker build -t lss0555/docker-cmd .
(1) 运行指令后如下:
docker run lss0555/docker-cmd
结果输出:
hello lss0555
(2) 如果运行指令为
docker run lss0555/docker-cmd echo hi
结果输出:
hi
总结
- 当 run 时没带其他命令, 默认执行 CMD 里的命令
- 如果docker run指定了其他命令,cmd命令则会被忽略
- 如果定义了多个CMD,只有最后一个会被执行.
二.ENTRYPOINT
1.定义
设置容器启动时运行的命令
2.两种写法:
- 写法一:
ENTRYPOINT [“executable”, “param1”, “param2”] (the preferred exec form)
- 写法二:
ENTRYPOINT command param1 param2 (shell form)
第二种(shell form)会屏蔽掉docker run时后面加的命令和CMD里的参数
3.例子
创建Dockerfile文件,内容如下:
FROM ubuntu
ENTRYPOINT ["/bin/echo","hello"]
创建镜像
docker build -t lss0555/docker-entrypoint .
(1)运行结果如下:
docker run lss0555/docker-entrypoint
结果:
hello
(2) 如果运行执行为
docker run lss0555/docker-entrypoint world
运行结果如下:
hello world
4.总结
- 让容器以应用程序或者服务的形式运行(比如:数据库的服务)
- 不会被忽略,一定会被执行
- 最佳实践:写一个shell脚本作为entrypoint
三.ENTRYPOINT与CMD一起用
编写Dockerfile问下,如下:
FROM ubuntu
ENTRYPOINT ["/bin/echo","hi,"]
CMD ["hello"]
创建镜像文件为:
docker build -t lss0555/docker-entrypoint-cmd .
(1) 运行该镜像
docker run lss0555/docker-entrypoint-cmd
结果为:
hi, hello
(2) 如果运行指令后面加上 world
docker run lss0555/docker-entrypoint-cmd world
则运行结果为:
hi,world
总结
- 当 run 时没带其他命令, 执行 ENTRYPOINT + CMD 里的命令
- 当 run 时带有其他命令, 会覆盖 CMD 里的命令, 执行 ENTRYPOINT + 输入的命令