Каков наилучший способ вызова различных сценариев 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/