機器翻譯自: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 直接停止該容器。