【问题标题】:docker run entrypoint with multiple commandsdocker run 带有多个命令的入口点
【发布时间】:2021-10-09 14:43:38
【问题描述】:

如何在docker run 中有一个执行多个命令的入口点? 比如:

docker run --entrypoint "echo 'hello' && echo 'world'" ... <image>

我正在尝试运行的映像已经在 Dockerfile 中设置了一个入口点,所以像下面这样的解决方案似乎不起作用,因为它看起来我的命令被忽略了,并且只执行了原始入口点

docker run ... <image> bash -c "echo 'hello' && echo 'world'"

在我的用例中,我必须使用docker run 命令。更改Dockerfile 的解决方案是不可接受的,因为它不在我手中

【问题讨论】:

  • 你能创建一个包含所有命令的 bash 脚本并将其用作入口点的输入吗?不确定这是否可行。

标签: bash docker docker-compose dockerfile


【解决方案1】:

作为一个样式点,如果您的图像有一个可以被覆盖的CMD,这将变得非常容易。如果您只需要运行一个没有初始设置的命令,请将其设为 CMD 而不是 ENTRYPOINT

CMD ./some_command  # not ENTRYPOINT

如果您需要进行一些初始设置然后启动主命令,请将ENTRYPOINT 设为以特殊指令exec "$@" 结尾的shell 脚本。 CMD 将作为参数传递给它,这一行将 shell 脚本替换为该命令。

#!/bin/sh
# entrypoint.sh
... do first time setup, run database migrations, set variables ...
exec "$@"
# Dockerfile
...
ENTRYPOINT ["./entrypoint.sh"] # MUST be JSON-array syntax
CMD ./some_command             # as before

如果您做这些事情,那么您可以使用您最初的docker run 表单。这将替换CMD,但保持ENTRYPOINT 不变。在包装脚本的情况下,您的备用命令将作为exec "$@" 命令运行,因此所有首次设置都将首先完成。

# Assuming the image correctly honors the CMD
docker run ... \
  image-name \
  sh -c 'echo "foo is $FOO" && echo "bar is $BAR"'

如果你真的不能这样做,你可以覆盖docker run --entrypoint。这运行而不是图像的入口点(如果你想要图像的入口点,你必须自己运行它),并且语法很尴尬:

# Run a shell command instead of the entrypoint
docker run ... \
  --entrypoint /bin/sh \
  image-name \
  -c 'echo "foo is $FOO" && echo "bar is $BAR"'

请注意,--entrypoint 选项位于图像名称之前,其参数位于图像名称之后

【讨论】:

  • @David Maze 答案的略微修改版本对我有用:docker run -it --entrypoint sh my_docker './commands.sh' 其中 commands.sh 是位于 docker 内的一组命令(没有 exec "$@" 部分)跨度>
  • 这是我在谷歌搜索 2 天后为我的用例找到的最佳答案。我有一个基于 Alpine 容器的小型服务,它需要另一个小型配套 cron 作业。我希望cornd 命令始终运行,并且服务启动命令可由 docker 覆盖。所以我把crond 放在 ENTRYPOINT 里面,把服务启动放在 CMD 里面。 exec "$@" 将它们连接在一起。以前我尝试过&amp;&amp;,但没有成功。
猜你喜欢
  • 2021-02-04
  • 2020-07-09
  • 2019-01-03
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多