一、需求
为容器启动时指定需要运行的命令
二、CMD指令指定容器启动时运行的命令
# (shell格式)
CMD
# 或 (exec格式,推荐格式)
CMD [“executable”,”param1”,”param2”]
# 或 (为ENTRYPOINT指令提供参数)
CMD[”param1”,”param2”]
例如:
# 等同于CMD echo $HOME
CMD [ "sh", "-c", "echo $HOME" ]
#先创建一个新的空文件夹
mkdir newdir
#进入这个新文件夹中
cd newdir
#创建一个Dockerfile文件
touch Dockerfile
# 补全Dockerfile的内容(为了方便展示,这里用的是echo向Dockerfile中输入内容)
# linux中>表示覆盖原文件内容,>>表示追加内容。
echo "FROM ubuntu" > Dockerfile
# 注意双引号需要转义,其它不需要
echo "CMD [\"sh\", \"-c\", \"echo $HOME\"]" >> Dockerfile
#使用该Dockerfile构建一个名为myubuntu的镜像,注意这个小数点
docker build -t myubuntu .
# 创建容器
docker run myubuntu
CMD
指令提供容器启动时运行的默认命令,例如ubuntu
镜像默认的CMD
是/bin/bash
,因此我们可以直接使用 docker run -it ubuntu
进入bash
# 将Dockerfile中CMD设置的默认启动命令覆盖,也就是说:cat /etc/os-release命令会替代成为容器的启动命令,所以输出了系统版本信息
docker run -it ubuntu cat /etc/os-release
三、ENTRYPOINT指令指定容器启动时运行的命令
# (shell格式)
ENTRYPOINT
# 或 (exec格式,推荐格式)
ENTRYPOINT ["executable","param1","param2"]
四、CMD指令和ENTRYPOINT指令区别
1. 用户在执行docker run
命令创建并启动容器时,如果指定了启动命令,那么“该启动命令”会覆盖CMD
指令设置的默认启动命令,但是ENTRYPOINT
设置的启动命令该不能被覆盖。
2. CMD
命令可以为ENTRYPOINT
指令提供参数
五、实例 1. 使用CMD指令
需要一个得知使用者当前公网IP
的镜像
#先创建一个新的空文件夹
mkdir newdir
#进入这个新文件夹中
cd newdir
#创建一个Dockerfile文件
touch Dockerfile
# 补全Dockerfile的内容(为了方便展示,这里用的是echo向Dockerfile中输入内容)
# linux中>表示覆盖原文件内容,>>表示追加内容。
echo "FROM centos" > Dockerfile
echo "RUN yum install curl" >> Dockerfile
# 注意双引号需要转义,其它不需要
echo "CMD [\"curl\",\"-s\",\"http://cip.cc\"]" >> Dockerfile
#使用该Dockerfile构建一个名为myip的镜像,注意这个小数点
docker build -t myip .
# 创建容器
docker run myip
如果我们要给上面的命令加参数
# 错误
docker run myip -i
# 正确
docker run myip curl -s http://ip.cn –i
如果是用ENTRYPOINT就可以解决这个问题
2. 使用ENTRYPOINT固定命令
#先创建一个新的空文件夹
mkdir newdir
#进入这个新文件夹中
cd newdir
#创建一个Dockerfile文件
touch Dockerfile
# 补全Dockerfile的内容(为了方便展示,这里用的是echo向Dockerfile中输入内容)
# linux中>表示覆盖原文件内容,>>表示追加内容。
echo "FROM centos" > Dockerfile
echo "RUN yum install curl" >> Dockerfile
# 注意双引号需要转义,其它不需要
echo "ENTRYPOINT [\"curl\",\"-s\",\"http://cip.cc\"]" >> Dockerfile
#使用该Dockerfile构建一个名为myip的镜像,注意这个小数点
docker build -t myip .
# 创建容器
docker run myip
# 可以加参数,docker run命令ENTRYPOINT不会被覆盖。它会作为参数传给ENTRYPOINT,从而达到了我们预期的结果。
docker run myip -i
3. 使用ENTRYPOINT固定部分命令,使用CMD允许替换部分命令(参数)
默认情况下,将启动命令设置为df -Th
。要求df
命令不能被覆盖,但-Th
能够被覆盖;(df
命令用来查看磁盘的信息)
#先创建一个新的空文件夹
mkdir newdir3
#进入这个新文件夹中
cd newdir3
#创建一个Dockerfile文件
touch Dockerfile
# 补全Dockerfile的内容(为了方便展示,这里用的是echo向Dockerfile中输入内容)
# linux中>表示覆盖原文件内容,>>表示追加内容。
echo 'FROM busybox' > Dockerfile
echo 'ENTRYPOINT ["df"]'>> Dockerfile
echo 'CMD ["-Th"]'>> Dockerfile
#使用该Dockerfile构建一个名为myip的镜像,注意这个小数点
docker build -t mydisk .
# 创建容器
docker run mydisk
# 带参数
docker run mydisk -i
参考:https://www.educoder.net/shixuns/zawfjtnm/challenges