首页 » PHP教程 » PHPexeccmd参数技巧_Linux云计算教程全套视频合集CMD指令讲解

PHPexeccmd参数技巧_Linux云计算教程全套视频合集CMD指令讲解

访客 2024-11-15 0

扫一扫用手机浏览

文章目录 [+]

Docker 不是虚拟机,容器便是进程,CMD 指令便是用于指定默认的容器主进程的启动命令的。
在启动(运行)一个容器时可以指定新的命令来替代镜像设置中的这个默认命令。

可以包含可实行文件,当然也可以省略。
CMD 指令的格式和 RUN 相似,也是两种格式:

PHPexeccmd参数技巧_Linux云计算教程全套视频合集CMD指令讲解

shell 格式:CMD <命令>exec 格式:CMD ["可实行文件", "参数1", "参数2"...]参数列表格式:CMD ["参数1", "参数2"...]。
在指定了 ENTRYPOINT 指令后,用 CMD 指定详细的参数。

把稳:不要稠浊RUN 和 CMD。
RUN实际上运行一个命令并提交结果; CMD在构建时不实行任何操作,但指定镜像的默认命令。

PHPexeccmd参数技巧_Linux云计算教程全套视频合集CMD指令讲解
(图片来自网络侵删)

插个小,也方便想学习的同学,在文章下方留言即可试听课程外加领取千锋HTML5、UI交互设计、PHP、Java+云数据、大数据开拓、VR/AR/Unity游戏开拓、Python人工智能、Linux云打算、全栈软件测试、网络安全等全部的视频学习教程。

Docker 不是虚拟机,容器内没有后台做事的观点。
不要期望这样启动一个程序到后台:

CMD systemctl start nginx

这行被 Docker 理解为:

CMD ["sh" "-c" "systemctl start nginx"]

对付容器而言,其启动程序便是容器的运用进程,容器便是为了主进程而存在的,主进程退出,容器就失落去了存在的意义,从而退出,其它赞助进程不是它须要关心的东西。

就像上面的示例中,主进程是 sh , 那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会使容器退出。

精确的做法是直接实行 nginx 这个可实行文件,并且关闭后台守护的办法,使程序在前台运行。

CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT 指令

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器的启动程序及参数。

ENTRYPOINT 在运行时也可以被替代,不过比 CMD 要略显繁琐,须要通过 docker run 的参数 --entrypoint 来指定。

ENTRYPOINT 的格式和 RUN 指令格式一样,也分为 exec 格式和 shell 格式。

当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,也便是实际实行时,将变为:

<ENTRYPOINT> "<CMD>"

有了 CMD 后,为什么还要有 ENTRYPOINT 呢?

这种 <ENTRYPOINT> "<CMD>" 给我们带来了什么好处么?

让我们来看几个场景。

场景一:让镜像变成像命令一样利用

CMD 办法

FROM centos

RUN yum update \

&& yum install -y curl

CMD [ "curl", "-s", "http://ip.cn" ]

构建镜像后, 运行容器

# docker run --rm centos-echo-ip-cmd

实行下面命令会报错

# docker run --rm centos-echo-ip-cmd -i

我们可以看到报错,executable file not found。
之前我们说过,跟在镜像名后面的是 command,运行时会更换 CMD 的默认值。
因此这里的 -i 并不是添加在原来的 curl -s http://ip.cn 后面。
而是更换了原来的 CMD,变成了 CMD ["-i"],而 -i 根本不是命令,以是报了可实行文件找不到。

以是该当利用 ENTRYPOINT 办法

FROM centos

RUN yum install -y curl

ENTRYPOINT ["curl", "-s", "http://ip.cn"]

再次构建镜像后, 运行容器

# docker run --rm centos-echo-ip-entrypoint

# docker run --rm centos-echo-ip-entrypoint -i

这样的话, 终极的指令就变成 ENTRYPOINT ["curl", "-s", "http://ip.cn", "-i"]

场景二:运用运行前的准备事情

启动容器便是启动主进程,但有些时候,启动主进程前,须要一些准备事情。

官方镜像 redis 中的示例:

FROM alpine:3.4

RUN addgroup -S redis && adduser -S -G redis redis

ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379

CMD [ "redis-server" ]

可以看到个中为 redis 做事创建了 redis 用户,并在末了指定了 ENTRYPOINT 为 docker-entrypoint.sh 脚本。

#!/bin/sh

# allow the container to be started with `--user`

if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then

chown -R redis .

exec gosu redis "$0" "$@"

fi

exec "$@"

该脚本的内容便是根据 CMD 的内容来判断,如果是 redis-server 的话,则切换到 redis 用户身份启动做事器,否则依旧利用 root 身份实行。
比如:

$ docker run -it redis id

uid=0(root) gid=0(root) groups=0(root)

还有 ENTRYPOINT 指令不会被 RUN 指令覆盖,而 CMD 指令会被 RUN 指令覆盖。

标签:

相关文章