Docker-compose передает переменную среды в контейнер docker и в npm start

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

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

Поэтому я хочу иметь файл .env в том же каталоге верхнего уровня вместе с docker-compose.yml и Dockerfile, который содержит запись для NODE_ENV.

Звучит довольно прямолинейно?

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

FROM node:latest

ENV NODE_ENV=development

WORKDIR /usr/src/app

COPY ./package*.json /usr/src/app/

RUN npm install

ADD . .

CMD ["sh", "-c", "npm run start:${NODE_ENV}"]

EXPOSE 3001

Он работает как шарм, затем я запускаю его из командной строки с помощью

docker run -e "NODE_ENV=разработка" .

Однако добавьте в уравнение docker-compose, и все пойдет не так. И это тоже не дает много ошибок.

version: '3'
services:
  app:
    build: .
    environment: 
      - NODE_ENV=$NODE_ENV 
    ports:
      - '80:3001'
    links:
      - mongodb
  mongodb:
    image: mongo
    ports:
      - '27017:27017'

Теперь, если я запущу это с помощью конфигурации docker-compose, я увижу, что переменная среды установлена ​​​​правильно.

services:
  app:
    build:
      context: /home/me/myproject
    environment:
      NODE_ENV: development
    links:
    - mongodb
    ports:
    - 80:3001/tcp
  mongodb:
    image: mongo
    ports:
    - 27017:27017/tcp
version: '3.0'

Итак, мой вопрос в основном, может ли кто-нибудь определить, что я делаю неправильно? Или это ошибка в докере, о которой я должен сообщить?

Единственные подсказки, данные из журналов,

app_1 exited with code 2

и в журнале контейнера

/bin/sh: 1: [: npm run ,: unexpected operator

person Charlie Benger-Stevenson    schedule 24.04.2020    source источник


Ответы (1)


Я заработал, поместив строку переменной среды в docker-compose в двойные кавычки.

version: '3'
services:
  app:
    build: .
    environment: 
      - "NODE_ENV=$NODE_ENV" 
    ports:
      - '80:3001'
    links:
      - mongodb
  mongodb:
    image: mongo
    ports:
      - '27017:27017'
person Charlie Benger-Stevenson    schedule 27.04.2020