我有一个码头图片myapp:1.0
在mydocker文件中,我有一个CMD
行来指定图像的主要功能(运行django应用程序)。
我想知道的是,如果有一种方法可以传递一个参数,在docker run
调用期间执行图像并根据参数执行不同的命令。
例如:
CMD[ { "run1": "run_script_a.sh" }, { "run2": "run_script_b.sh" } ]
所以我可以这样运行我的码头图像:
docker run myapp:1.0 run1
#will执行run_script_a.sh
docker run myapp:1.0 run2
#will执行run_script_b.sh
答案 0 :(得分:3)
不要忘记添加到docker run的任何参数都会自动覆盖图像中定义的CMD
。
docker run myimage run_script_b.sh
即使run_script_b.sh
定义CMD
,也会运行run_script_a.sh
(前提是ENTRYPOINT
为[ "/bin/sh", "-c" ]
。)
话虽这么说,你可以尝试从同一个Dockerfile构建2个不同的图像,用--build-arg
设置构建时变量:
docker build --build-arg RUN=run_script_a.sh ... --name run1 .
docker build --build-arg RUN=run_script_b.sh ... --name run2 .
使用Dockerfile包括:
CMD[ $RUN ]
如果CMD位于Dockerfile的末尾,则对于这两个图像(而不是一个图像),磁盘空间的开销将是最小的。
唯一的好处是你在运行run1或run2映像时不必传递任何东西:它们将启动它们各自的脚本。
答案 1 :(得分:1)
您可以将环境变量添加到docker run。您可以使用通用的run_script.sh,它将基于该变量启动特殊脚本,例如:
docker run -e "script=a" myimage
请参阅https://docs.docker.com/engine/reference/run/#env-environment-variables