为不同的容器向 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
我建议编写自定义入口点脚本来处理这种情况。
一般来说,在大多数情况下,您可能会发现使用 CMD
比 ENTRYPOINT
更可取。特别是
的调试 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
我有这张简单的 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
我建议编写自定义入口点脚本来处理这种情况。
一般来说,在大多数情况下,您可能会发现使用 CMD
比 ENTRYPOINT
更可取。特别是
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