gpt4 book ai didi

docker - 将环境变量传递给 dockerfile 构建

转载 作者:行者123 更新时间:2023-12-02 18:22:32 24 4
gpt4 key购买 nike

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

最佳答案

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

您需要使用构建参数。在 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)

关于docker - 将环境变量传递给 dockerfile 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47289033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com