将环境变量传递给dockerfile构建

时间:2017-11-14 15:06:37

标签: docker environment-variables docker-compose dockerfile

我正在尝试在docker容器中创建一个由Web服务器和数据库组成的服务。目前我正在尝试为包含数据库凭据的两者创建相同的环境文件。不幸的是,当我尝试使用它构建数据库时,事实证明它们是空的。如何为两个组件创建包含单个环境文件的项目?这是我的docker-compose.yml:

version: '2'

services:
  db:
    build:
      context: .
      dockerfile: Dockerfile-db
    ports:
      - '5433:5432'
    env_file:
      - env
  web:
    build: .
    ports:
      - '8000:8000'
    command: venv/bin/python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
    env_file:
      - env

以下是我的Dockerfile-db文件的一部分,负责创建数据库:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y postgresql-9.5-postgis-2.2

USER postgres

ARG DB_PASSWORD
ARG DB_NAME

RUN echo $DB_PASSWORD

RUN /etc/init.d/postgresql start && \
    psql --command "ALTER USER postgres WITH PASSWORD '$DB_PASSWORD';" && \
    psql --command "CREATE DATABASE $DB_NAME;" && \
    psql --command "\\c $DB_NAME" && \
    psql --command "CREATE EXTENSION postgis;" && \
    psql --command "CREATE EXTENSION postgis_topology;"

我的env文件有以下结构:

DB_NAME=some_name
DB_USER=postgres
DB_PASSWORD=some_password
DB_HOST=db
DB_PORT=5432

2 个答案:

答案 0 :(得分:2)

环境文件不是构建过程的一部分,它在运行容器时使用。

您需要使用build-args。在docker-compose中,您可以在文件中指定构建参数:

build:
  context: .
  dockerfile: Dockerfile-db
  args:
    DB_NAME: some_name
    DB_USER: postgress
    ...

如果要发布composefile,这可能不是一个好主意,因为您要在其中存储凭据。您可以显式构建并传递--build-arg

docker-compose build --build-arg DB_NAME= some_name ...

运行时在docker-compose run --no-build

中指定无构建

<强>更新

正如@gonczor所建议的那样,使用更简洁的语法将env文件作为构建参数传递:

docker-compose build --build-args $(cat envfile)

答案 1 :(得分:0)

您的配置正确,似乎您可能没有传递实际的路径或.env文件的名称。您是否尝试过以下操作(假设您的.env文件位于同一目录中)。

version: '2'

services:
  db:
    build:
      context: .
      dockerfile: Dockerfile-db
    ports:
      - '5433:5432'
    env_file:
      - ./.env
  web:
    build: .
    ports:
      - '8000:8000'
    command: venv/bin/python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
    env_file:
      - ./.env