Docker教程小白实操入门(14)--如何使用CMD和ENTRYPOINT指令指定容器启动时要运行的命令

一、需求

为容器启动时指定需要运行的命令

二、CMD指令指定容器启动时运行的命令

# (shell格式)
CMD <command>

# 或  (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 <command>

# 或 (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

猜你喜欢

转载自blog.csdn.net/u013288190/article/details/108937673