向Dockerfile构建传递环境变量

4

我正在尝试创建一个包含Web服务器和数据库的服务,这两个组件都在Docker容器中。目前,我正在尝试为它们创建相同的环境文件,其中包含数据库凭据。不幸的是,当我尝试使用它构建数据库时,它们却是空的。如何创建一个具有单一环境文件的项目,用于同时管理这两个组件?以下是我的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个回答

4

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

您需要使用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 所建议的那样,更短、更简洁的语法是将环境文件作为构建参数传递:

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

我一直收到这个消息,好像不支持 --build-arg。这可能是由于 docker-compose 版本引起的吗?(我正在运行1.8)用法:build [选项] [SERVICE...]选项:      --force-rm 始终删除中间容器。      --no-cache 构建镜像时不使用缓存。      --pull 始终尝试拉取图像的新版本。 - gonczor
是的,可能需要更新Docker Compose。如果docker-compose build --help没有显示--build-arg选项,则需要更新Docker Compose。 - yamenk
1
谢谢帮助。它起作用了。我想到了一个解决方法。我只是在命令中添加了--build-args $(cat env)。如果您能够将其添加到答案中,我将不胜感激。 - gonczor

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接