将环境variables传递给dockerfile构build

我正在尝试在Docker容器中创build一个由Web服务器和数据库组成的服务。 目前我正在尝试为它们包含数据库凭证创build相同的环境文件。 不幸的是,当我尝试用它build立数据库时,事实certificate它们是空的。 我如何使用单个环境文件为这两个组件创build一个项目? 这是我的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 

这是我负责创build数据库的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 

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

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

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

如果你想发布组合文件,这可能不是一个好主意,因为你正在存储凭据。 你可以明确的build立并传递--build-arg

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

并且在运行时,在docker-compose run --no-build指定没有构builddocker-compose run --no-build

更新:

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

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