переменная среды сборки docker-compose - PullRequest
0 голосов
/ 20 сентября 2018

TL; DR: Как передать переменную env при построении образа с помощью docker-compose и сделать так, чтобы docker run image command распознал их?

У меня есть этот Dockerfile:

FROM mhart/alpine-node:10
ADD . /app
WORKDIR /app
RUN apk --no-cache add --virtual builds-deps build-base python &&\
    yarn global add nodemon &&\
    yarn &&\
    apk del builds-deps build-base python

и этот docker-compose.yml:

version: "3.3"
services:

  api:
    build:
      context: .
      dockerfile: Dockerfile-preprod
    image: registry.git.louis-girones.fr:4567/make-your-night/back:preprod
    environment:
      - NODE_ENV=development
    env_file:
      - .env
    volumes:
      - .:/app
    ports:
      - "${PORT_PREPROD}:${PORT_PREPROD}"
    command: sh -c "mkdir -p dist && touch ./dist/app.js && yarn run start"

  mongo:
    image: mongo:4.0
    ports:
      - "${MONGO_PREPROD}"
    command: mongod
    volumes:
      - ./data:/data/db

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
    volumes:
      - ./esdata:/usr/share/elasticsearch/data
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.type=single-node
    ports:
      - "9300:9300"
      - "9200:9200"

volumes:
  esdata:

С этим файлом .env (который находится в корневой папке, например, docker-compose.yml и Dockerfile):

#!/usr/bin/env bash

NODE_ENV=development
PORT=9000
SECRET_SESSION=superSecr3t
APP_NAME=Night Vision
API_VERSION=/api/v0/
DEFAULT_TZ=Europe/Paris
ASSETS_URI=http://localhost:9000/public/img/
BCRYPT_WORKFACTOR=1
ES_PORT=9200
ES_LOG_LEVEL=trace

И этот код при запуске сервера узла:

// Export the config object based on the NODE_ENV
// ==============================================
const config: IConfig = commonConfig

if (commonConfig.env === 'development') {
    _.merge(config, developmentConfig)
} else if (commonConfig.env === 'test') {
    _.merge(config, testConfig)
} else if (commonConfig.env === 'preproduction') {
    _.merge(config, preproductionConfig)
} else if (commonConfig.env === 'production') {
    _.merge(config, productionConfig)
} else {
    throw new Error('Please set an environment')
}

Когда я запускаю команду docker-compose build, все в порядке, но, например, если я пытаюсь docker run myimage yarn run test Ошибка "Пожалуйста, установитесреда "брошена.

Я бы ожидал, что

env_file:
  - .env

сделает переменные env этого файла доступными на моем изображении, но это не так, поэтому я попытался добавить

 environment:
  - NODE_ENV=development

Но все равно безуспешно, я также пытался передать переменную env в качестве аргумента командной строки при запуске сборки:

docker-compose build --build-arg NODE_ENV=development api

Но это выдает мне следующее сообщение:

[Warning] One or more build-args [NODE_ENV] were not consumed
Successfully built 9b14dd5abc3f

И я бы действительно предпочел использовать первый или второй методы

версия docker: 18.06.1-ce версия docker-compose: 1.19.0

1 Ответ

0 голосов
/ 20 сентября 2018

В документах есть примечание :

Примечание: Если в вашей службе задан параметр построения, переменные, определенные в среде, не будут автоматически отображаться во времясборка.Используйте опцию args сборки для определения переменных среды во время сборки.

Это также , описанное здесь .Сначала (как упомянуто выше), вам нужно указать ARG в Dockerfile:

FROM mhart/alpine-node:10
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
ADD . /app
WORKDIR /app
RUN apk --no-cache add --virtual builds-deps build-base python &&\
    yarn global add nodemon &&\
    yarn &&\
    apk del builds-deps build-base python

А затем отредактируйте файл docker-compose, чтобы он включал аргумент во время сборки, например:

build:
  context: .
  dockerfile: Dockerfile-preprod
  args:
    - NODE_ENV=development

Или даже

build:
  context: .
  dockerfile: Dockerfile-preprod
  args:
    - NODE_ENV=${NODE_ENV}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...