Добавить аргументы в entrypoint / cmd для разных контейнеров - PullRequest
0 голосов
/ 15 мая 2019

У меня есть это простое изображение 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 ]

1 голос
/ 15 мая 2019

Я бы предложил написать собственный сценарий точки входа для обработки этого случая.

Как правило, в большинстве случаев предпочтительнее использовать от CMD до ENTRYPOINT. В частности, шаблон отладочной оболочки

docker run --rm -it myimage sh

действительно полезен, и использование ENTRYPOINT для запуска вашего основного приложения ломает это. Шаблон сценария точки входа, который я собираюсь описать, также очень полезен в целом, и его легко добавить, если ваш основной контейнерный процесс описан с помощью CMD.

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

Сам сценарий является обычным сценарием оболочки, который передается CMD в качестве аргументов командной строки. Обычно он заканчивается на exec "$@" для фактического запуска CMD в качестве основного процесса контейнера.

Поскольку сценарий точки входа является сценарием оболочки и ему передается команда из командной строки 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
0 голосов
/ 15 мая 2019

Кажется, что это работает:

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

, что эквивалентно просто:

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

вы не можете использовать одинарные кавычки - необходимы двойные кавычки, иВы должны использовать синтаксис оболочки ... не знаю почему, но этот стиль не работает:

ENTRYPOINT node dist/main.js
...