将参数添加到不同容器的入口点/ cmd

时间:2019-05-15 07:48:18

标签: docker docker-run docker-entrypoint

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

2 个答案:

答案 0 :(得分:1)

这似乎可行:

<android.support.v7.widget.RecyclerView
                    android:id="@+id/studentListView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingBottom="56dp"/>

似乎等同于:

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

您似乎无法使用单引号-双引号是必需的,并且您必须使用shell语法。不确定为什么,但是这种样式起作用:

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

答案 1 :(得分:1)

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

通常,您可能会发现在大多数情况下,最好使用CMDENTRYPOINT。特别是

的调试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