Dockerfile: есть ли способ читать переменные из файла .env - PullRequest
4 голосов
/ 09 мая 2020

Я хочу прочитать переменную PORT внутри Dockerfile, которая определена в файле .env. Есть ли способ сделать это?

Это мой Dockerfile:

FROM node:11-alpine

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

ENV PORT=3000

COPY . .

RUN npm install

EXPOSE 3000

CMD ["npm", "run", "start"]

Ответы [ 2 ]

6 голосов
/ 09 мая 2020

ОБНОВЛЕНО

После обсуждения в чате выяснилось, что с контейнером приложения nodejs проблем нет, и проблема связана с неправильно настроенным прокси nginx.

Доказательством работоспособности приложения nodejs является следующий файл docker -compose.

version: "3"
services:
    api:
        build: .
    curl:
        image: curlimages/curl:7.70.0
        depends_on:
          - api
        entrypoint: ""
        command: curl -si --retry 5 --retry-delay 5 --retry-max-time 40 http://api:6000
        restart: on-failure

ORIGINAL

Если вы хотите изменить порт во время процесса сборки (он будет stati c позже, когда вы запустите контейнер), затем используйте build-args

docker build --build-arg APP_PORT=3000
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG APP_PORT=80
EXPOSE ${APP_PORT}

COPY . .
RUN APP_PORT=${APP_PORT} npm install

CMD APP_PORT=${APP_PORT} npm run start

, если вы хотите иметь возможность изменить порт, когда вы ' повторный запуск контейнера - тогда build-args не подходят и вам нужно оставить env переменных. Обратите внимание, что после сборки EXPOSE не может быть изменено.

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

Вы даже можете пропустить EXPOSE в своем файле, потому что это скорее метаданные вашего изображения, чем инструкция для открытия системы порт: https://docs.docker.com/engine/reference/builder/#expose

Независимо от настроек EXPOSE, вы можете переопределить их во время выполнения, используя флаг -p.

if ваше изображение - stati c после сборки (вы не планируете менять .env), вы можете сделать дальше, тогда npm install и npm run start будут иметь тот же env. И вам все еще разрешено изменить порт позже, но это не повлияет на npm install.

FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .
RUN export $(cat .env) && npm install 

CMD export $(cat .env) && npm run start

, если вам нужно сохранить CMD как массив - тогда нам нужно создать bootstrap сценарий

FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .
RUN export $(cat .env) && npm install

RUN echo '#!/usr/bin/env sh' > start.sh && echo 'export $(cat .env) && npm run start ${@}' >> start.sh
CMD ["sh", "./start.sh"]
2 голосов
/ 09 мая 2020

вы можете использовать ARG в вашем Dockerfile, который предназначен для этой цели.

...