【问题标题】:Run a simple shell script before running CMD command in Dockerfile在 Dockerfile 中运行 CMD 命令之前运行一个简单的 shell 脚本
【发布时间】:2020-09-05 06:54:23
【问题描述】:

我有一个 dockerfile,最后一个命令是

CMD ["/opt/startup.sh"]

现在我有另一个 shell 脚本,即replacevariables.sh,我想在我的 dockerfile 中执行以下命令。

sh replacevariables.sh ${app_dir} dev

我怎样才能执行这个命令。这是一个简单的脚本,它基本上将替换${app_dir} 中文件的一些字符。什么可以解决这个问题,因为当我看到任何类型的文档时,他们都建议只运行一个 sh 脚本。

【问题讨论】:

  • 你能不能试试CMD ["sh", "-c", "/opt/startup.sh ; replacevariables.sh ${app_dir} dev"]语法也可以在上面的语法中添加基本路径到//replacevariables.sh并检查

标签: shell docker dockerfile


【解决方案1】:

您可以使用 Docker ENTRYPOINT 来支持这一点。考虑以下 Dockerfile 片段:

COPY entrypoint.sh .
RUN chmod +x entrypoint.sh replacevariables.sh
ENTRYPOINT ["./entrypoint.sh"]
# Same as above
CMD ["/opt/startup.sh"]

ENTRYPOINT 成为主容器进程,it gets passed the CMD as arguments。因此,您的入口点可以进行首次设置,然后运行特殊的 shell 命令exec "$@" 以将其自身替换为给出的命令。

#!/bin/sh
./replacevariables.sh "${app_dir}" dev
exec "$@"

即使您在容器中启动了一些备用命令(例如,docker run --rm -it yourimage bash 以获取调试 shell),这也只会替换“命令”部分,因此 bash 在脚本中变为 "$@" ,并且您仍然在启动 shell 之前进行首次设置。

重要的注意事项是 ENTRYPOINT 必须是 JSON 数组形式(CMD 可以是包裹在 /bin/sh -c 中的裸字符串,但此设置会破坏 ENTRYPOINT)你只会得到一个ENTRYPOINT。如果你已经有一个ENTRYPOINT(许多 SO 问题似乎喜欢在那里命名一个解释器)将它移到CMD 的开头(CMD ["python3", "./script.py"])。

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多