0

我有这个简单的 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 的信息,但我不知道该怎么做,有人知道吗?

4

2 回答 2

1

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

一般来说,您可能会发现在大多数情况下使用CMDto更可取。ENTRYPOINT特别是调试 shell 模式

docker run --rm -it myimage sh

非常有用,并且ENTRYPOINT用于运行您的主应用程序会破坏这一点。我将要描述的入口点脚本模式通常也非常有用,如果你的主容器进程用CMD.

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

脚本本身是一个普通的 shell 脚本,它被CMD作为命令行参数传递。它通常exec "$@"以实际运行CMD作为主容器进程结束。

由于入口点脚本是一个 shell 脚本,并且它docker run从命令行作为参数传递命令,因此您可以对其进行动态切换,并满足您的要求,即能够将其他选项传递给您的脚本以及我的要求能够运行任意程序而不是 Node 应用程序。

#!/bin/sh
if [ $# = 1 ]; then
  # no command at all
  exec node dist/main.js
else
  case "$1" of
  -*) exec node dist/main.js "$@" ;;
  *)  exec "$@" ;;
  esac
fi
于 2019-05-15T12:35:35.743 回答
0

这似乎有效:

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

这似乎等同于:

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

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

ENTRYPOINT node dist/main.js
于 2019-05-15T07:59:26.597 回答