启动时 Dockerfile 入口点 Bash 脚本 运行,然后 运行 npm 脚本带有可附加的 CMD 参数

Dockerfile Entrypoint Bash script run upon start, then run npm script with appendable CMD argument

对于本地开发人员环境,我确保在每次启动时通过 /bin/sh 命令清除安装的 node_modules 目录,服务器启动前应该是 运行,但是在安装容器并 运行ning.

之后

期望的行为,指定的 NPM 脚本应该附加自“CMD”配置或其他 docker-compose 或 CLI 源

/bin/sh -c "rm -rf /usr/src/app/node_modules/* && npm run start 
// OR 
/bin/sh -c "rm -rf /usr/src/app/node_modules/* && npm run production 

我假设这种脚本启动行为在 .sh 文件中更常见 运行 作为入口点,但我想从 Dockerfile

中指定完整命令

我当前的 Dockerfile

ENTRYPOINT ["/bin/sh", "-c", "rm -rf /usr/src/app/node_modules/* && npm run ${exec $@}"]
CMD [ "start" ]

我不确定如何处理 ENTRYPOINT 数组中“$@”周围双引号的转义。

当前正在从容器启动中接收此输出

start: 1: start: Bad substitution

我强烈建议将此启动程序写入其自己的 shell 脚本中:

#!/bin/sh

# Delete the library tree from the image; we're not going to use it.
rm -rf /usr/src/app/node_modules

# Interpret the command we're given as a specific `npm run` script.
exec npm run "$@"

现在您可以在您的 Dockerfile 中 COPY 这个脚本,并将 ENTRYPOINT 设置为 运行 它。不要在这里使用 sh -c 包装器。

COPY entrypoint.sh ./
ENTRYPOINT ["./entrypoint.sh"] # in JSON-array syntax
CMD ["start"]

如果你要像这样内联sh -c,运行命令之后的任何参数都将作为位置参数[=17=]</code>和很快。通常 <code>[=17=] 是脚本名称(尝试将 echo "[=20=]" 添加到示例脚本中以查看结果)并且在构造 sh -c 时,您需要手动提供该参数。

ENTRYPOINT ["/bin/sh", "-c", "rm -rf node_modules && npm run \"\"", "script"]
CMD ["start"]

这些数组使用 JSON 语法,引号转义与 JSON 或 Javascript.

相同