为不同的容器向 entrypoint/cmd 添加参数

Add arguments to entrypoint/cmd for different containers

我有这张简单的 node.js 图片:

FROM node:12

USER root

WORKDIR /app

COPY package.json .
COPY package-lock.json .

RUN npm i --production

COPY . .

ENTRYPOINT node dist/main.js

最后,我只想像这样将不同的参数传递给 node dist/main.js

docker run -d my-image --foo --bar=3

所以运行时的可执行文件是

node dist/main.js --foo --bar=3

我已经阅读了有关 CMD / ENTRYPOINT 的内容,但我不知道该怎么做,有人知道吗?

这似乎有效:

ENTRYPOINT ["node", "dist/main.js"]
CMD []

这似乎等同于:

ENTRYPOINT ["node", "dist/main.js"]

你似乎不能使用单引号 - 双引号是必要的,你必须使用 shell 语法..不知道为什么,但这种风格 not 工作:

ENTRYPOINT node dist/main.js

我建议编写自定义入口点脚本来处理这种情况。

一般来说,在大多数情况下,您可能会发现使用 CMDENTRYPOINT 更可取。特别是

的调试 shell 模式
docker run --rm -it myimage sh

真的很有用,使用 ENTRYPOINT 到 运行 你的主应用程序打破了这一点。我将要描述的入口点脚本模式在一般情况下也非常有用,如果您的主容器进程用 CMD.

描述,它很容易投入使用
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["node", "dist/main.js"]

脚本本身是一个普通的 shell 脚本,它作为 command-line 参数传递给 CMD。它通常以 exec "$@" 结尾,实际上 运行 CMD 作为主要容器进程。

由于入口点脚本是一个shell脚本,它从docker run命令行作为参数传递命令,你可以在它上面做动态切换,同时满足你的要求只需能够将其他选项传递给您的脚本以及我的要求,即能够 运行 任意程序而不是 Node 应用程序。

#!/bin/sh
if [ $# = 1 ]; then
  # no command at all
  exec node dist/main.js
else
  case "" of
  -*) exec node dist/main.js "$@" ;;
  *)  exec "$@" ;;
  esac
fi