CMD和ENTRYPOINT
我们先来试一下构建以下这个Dockerfile,并运行
FROM centos
CMD ["ls","-a"]
构建
[root@zhima lizhi]# docker build -t mycentos .
Sending build context to Docker daemon 17.92kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
---> Running in a1e70a05d8dd
Removing intermediate container a1e70a05d8dd
---> 00433fd4c299
Successfully built 00433fd4c299
Successfully tagged mycentos:latest
运行
[root@zhima lizhi]# docker run -it --name "centos1" mycentos
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
可以发现,进入容器之后,就执行了ls -a
命令
我们尝试一下在启动的时候加入一些参数
[root@zhima lizhi]# docker run -it --name "centos2" mycentos -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
我们发现容器并没有执行ls -al
,而是直接报错了
其实这就是CMD的特性,当我在启动容器的时候添加了一个CMD后
镜像中定义的CMD就被覆盖掉了
单独的-l
当然会报错了
我们来看一下使用ENTRYPOINT会怎么样
修改Dockerfile
FROM centos
ENTRYPOINT ["ls","-a"]
重新构建
[root@zhima lizhi]# docker build -t mycentos .
Sending build context to Docker daemon 17.92kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 22ef40dea625
Removing intermediate container 22ef40dea625
---> 73a3d51b4d84
Successfully built 73a3d51b4d84
Successfully tagged mycentos:latest
运行容器
[root@zhima lizhi]# docker run -it --name "centos1" mycentos -l
total 56
drwxr-xr-x 1 root root 4096 Jul 14 08:52 .
drwxr-xr-x 1 root root 4096 Jul 14 08:52 ..
-rwxr-xr-x 1 root root 0 Jul 14 08:52 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jul 14 08:52 dev
drwxr-xr-x 1 root root 4096 Jul 14 08:52 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 191 root root 0 Jul 14 08:52 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Jan 29 10:27 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
可以发现,容器执行的是ls -al
,-l
指令被追加给了ENTRYPOINT定义的语句