Dockerfile, переключение между dev / prod - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в докере, я сделал их урок и некоторые другие вещи в Интернете, но это все .. Так что я думаю, что я делаю это очень неправильно ..

Прошёл один день с тех пор, как я искал способ опубликовать Dockerfile, который будет запускать npm run dev или npm start, в зависимости от среды prod или dev.

Playground

То, что я получил до сих пор:

# Specify the node base image version such as node:<version>
FROM node:10

# Define environment variable, can be overight by runinng docker run with -e "NODE_ENV=prod"
ENV NODE_ENV dev

# Set the working directory to /usr/src/app
WORKDIR /usr/src/app

# Install nodemon for hot reload
RUN npm install -g nodemon

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install && \
    npm cache clean --force

# Set the port used by the app
EXPOSE 8080

# Bundle app source
COPY . .

# Launch the app
CMD [ "nodemon", "server.js" ]

Из того, что я видел на www, является то, что люди склонны использовать bash для выполнения таких операций или монтировать том в docker-compose, однако этовыглядит настолько многословно, что просто выполняет условие if else внутри Dockerfile.

Цель

Без использования какого-либо другого файла (не усложняйте ситуацию)

Я ищу что-то вроде:

if [ "$NODE_ENV" = "dev" ]; then 
   CMD ["nodemon", "server.js"] // dev env
else
   CMD ["node", "server.js"] // prod env
fi

Может быть, яЯ ошибаюсь, любой хороший совет о том, как делать такие вещи в докере, был бы хорош.

Кроме того, отметьте, что я не уверен, как разрешить перезагрузку в моем контейнере при изменении файла на моем хосте, ядумаю, все дело в громкости, но опять же не знаю, как это сделать ..

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

К сожалению, нет способа применить эту логику в синтаксисе Dockerfile, все должно быть в сценарии точки входа.Чтобы избежать использования других файлов, вы можете реализовать эту логику в однострочном скрипте bash:

ENTRYPOINT ["/bin/bash"]
CMD ['-c','if [ "$NODE_ENV" = "dev" ]; then nodemon server.js; else node server.js; fi']
0 голосов
/ 23 октября 2018

Вы можете использовать ENTRYPOINT или CMD, чтобы вы могли выполнить bash-скрипт внутри контейнера в качестве первой команды.

ENTRYPOINT["your/script.sh"]
CMD["your/script.sh"]

в вашем скрипте сделайте свое дело!

Даже вам не нужно передавать переменную env, так как в скрипте вы можете получить к ней доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...