docker-compose 构建环境变量 [英] docker-compose build environment variable

查看:48
本文介绍了docker-compose 构建环境变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

TL;DR : 如何在使用 docker-compose 构建图像时传递 env 变量并让 docker run image command 识别它们?

TL;DR : How can I pass env variable when building the image with docker-compose and have docker run image command recognize them ?

我有这个 Dockerfile :

I have this 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 :

and this 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):

With this .env file (which is in the root folder, like docker-compose.yml and 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

以及节点服务器启动中的这段代码:

And this code in the node server startup :

// 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 错误请设置环境"被抛出.

When I run the docker-compose build command, everything is fine, but for instance If I try docker run myimage yarn run test the Error "Please set an environment" is thrown.

我希望

env_file:
  - .env

使这个文件的 env 变量可以在我的图像中访问,但事实并非如此,这就是我尝试添加

makes the env variables of this file accessible in my image but that is not the case, that's why I tried to add

 environment:
  - NODE_ENV=development

但仍然没有成功,我还尝试在运行构建时将我的 env 变量作为命令行参数传递:

But still no success, I have also tried to pass my env variable as command line argument when I run the build :

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

但它给了我这个信息:

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

我真的更喜欢使用第一种或第二种方法

And I would really prefer to use the first or second methods

docker 版本:18.06.1-cedocker-compose 版本:1.19.0

docker version : 18.06.1-ce docker-compose version : 1.19.0

推荐答案

有一个注释 在文档中:

注意:如果您的服务指定了构建选项,则环境中定义的变量在构建过程中不会自动可见.使用 build 的 args 子选项来定义构建时环境变量.

Note: If your service specifies a build option, variables defined in environment are not automatically visible during the build. Use the args sub-option of build to define build-time environment variables.

它也在此处描述.首先(如上所述),您需要在 Dockerfile 中指定 ARG:

It's also described in here. First (as mentioned above), you need to specify ARG in 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 文件以在构建期间包含参数,如下所示:

And then edit your docker-compose file to include the argument during build, like so:

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

甚至

build:
  context: .
  dockerfile: Dockerfile-preprod
  args:
    - NODE_ENV=${NODE_ENV}

这篇关于docker-compose 构建环境变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆