我正在尝试在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
答案 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