如何在 Docker 中运行自定义脚本
机器翻译自:Run Custom Scripts In Docker With Arguments - ENTRYPOINT Vs CMD (devopscube.com)
在这个例子中,我们自定义一个 shell 脚本,它接受三个命令行参数($1、$2 和 $3)。 如果将 true 作为第一个参数传递,则脚本将无限循环运行-死循环。 其他两个参数作为打印输出文本。
第 1 步:创建一个script.sh文件,复制以下内容。
#!/bin/bash set -x while $1 do echo "Press [CTRL+C] to stop.." sleep 5 echo "My second and third argument is $2 & $3" done
第 2 步:把 script.sh 和 Dockerfile 的放在同一文件夹下。
使用以下内容创建 Dockerfile,其是将脚本复制到容器,并使用 CMD 传递的参数来运行 ENTRYPOINT 中的命令。
bash中我们将 true 作为第一个参数传递,因此脚本将在无限循环中运行,将 batman 和 superman 参数作为输出。
FROM centos:7 MAINTAINER Devopscube RUN yum -y update && \ yum -y install httpd && \ yum clean all COPY ./script.sh / RUN chmod +x /script.sh ENTRYPOINT ["/script.sh"] CMD ["true", "batman", "superman"]
第 3 步:使用此Dockerfile构建镜像,镜像起名为 script-demo。
docker build -t script-demo .
第 4 步:使用 script-demo 镜像创建并运行一个名为 demo 的容器。
docker run --name demo -d script-demo
可以使用以下命令查看容器日志。
docker logs demo -f
第 5 步:还可以在 docker run 命令的末尾传递 CMD 参数。 它将覆盖在 Dockerfile 中传递的参数。 例如:
docker run --name demo -d script-demo false spiderman hulk
这里的 "false spiderman hulk"
将会覆盖写在Dockerfile里的 "true", "batman", "superman"
等几个参数。
特别值得注意一下的是,这里不管是 ENTRYPOINT 还是 CMD 都是定义在括号里,这种情况下,如果运行容器的时候不使用 -d 命令,则该容器会以命令行前台程序执行,将会直接在当前命令行里打印容器内部的echo输出,也可以直接用 ctrl + c 直接停止该容器。