Вызов различных команд в Dockerfiles в зависимости от среды

Каков наилучший способ вызова различных сценариев npm из Dockerfile зависимости от типа среды (т. Dockerfile Разработки или производства)?

Мой текущий Dockerfile ниже:

FROM node:12.15.0-alpine

ARG env

WORKDIR /usr/app

COPY ./ /usr/app

CMD npm run start

EXPOSE 5000

В идеале я хотел бы иметь возможность запускать сценарий запуска npm: сценарий разработки или запуск: сценарий производства.

Я попробовал сочетание переменных ARG и ENV, чтобы получить желаемый эффект. Однако, судя по закрытой ниже проблеме GitHub, они не доступны в той части цикла, которая мне потребуется.

т.е.

CMD npm run start:${env}

Прежде всего мне интересно, есть ли предпочтительная методология, которая используется для хранения всего в одном Dockerfile .

Редактировать:

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

RUN if [ "$env" = "production" ]; then 
    npm run start:prod; 
  else 
    npm run start:dev; 
  fi

Всего 1 ответ


Dockerfile работает в контексте «сборки», поэтому любые доступные переменные относятся к среде сборки (когда вы запускаете docker build ), а не к среде выполнения. Процесс сборки запускается только в первый раз, когда вы создаете образ.

Если вы хотите использовать переменные среды, определенные во время выполнения, вы можете использовать CMD указывающую на скрипт контейнера. Внутри этого скрипта все переменные окружения доступны из начального выполнения (запуска контейнера).

Dockerfile

...
COPY ./scripts /script/path
CMD /script/path/test.sh

./scripts/test.sh

cd /your/app/path
echo ENV = $ENV
npm run start:$ENV

Также вы можете просмотреть лучшие практики для Dockerfiles с хорошими примерами и примерами использования.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/


Есть идеи?

10000