如何在 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 直接停止该容器。

原文地址:https://www.cnblogs.com/lihan829/p/15146681.html