Postgresql 如何将环境变量传递给postgres容器

Postgresql 如何将环境变量传递给postgres容器,postgresql,docker,docker-compose,Postgresql,Docker,Docker Compose,我的码头工人 database: container_name: k4fntr_database build: ./docker/postgres restart: always environment: ENV: ${APP_ENV} TESTING_DB: ${DB_DATABASE_TESTING} POSTGRES_DB: ${DB_DATABASE} POSTGRES_USER: ${DB_USERNAME}

我的码头工人

  database:
   container_name: k4fntr_database
   build: ./docker/postgres
   restart: always
   environment:
     ENV: ${APP_ENV}
     TESTING_DB: ${DB_DATABASE_TESTING}
     POSTGRES_DB: ${DB_DATABASE}
     POSTGRES_USER: ${DB_USERNAME}
     POSTGRES_PASSWORD: ${DB_PASSWORD}
   ports:
    - "15432:5432"
   volumes:
    - ./docker/postgres/pg-data:/var/lib/postgresql/data:rw
   networks:
    - backend-network
我想在容器构建之后创建另外两个数据库,但前提是它是本地开发的

为此,我创建了一个文件夹docker entrypoint initdb.d,其中包含一个脚本

#!/bin/bash

set -e
set -u

if [ "$ENV" == 'local' ]; then
     (
      echo "CREATE DATABASE $TESTING_DB OWNER $POSTGRES_USER;"
     ) | (export PGPASSWORD=$POSTGRES_PASSWORD && psql -h 127.0.0.1 -U $POSTGRES_USER)
fi
我还有一个dockerfile,在这里我将这个文件夹复制到容器中

FROM postgres:10.5-alpine
COPY /docker-entrypoint-initdb.d/ /docker-entrypoint-initdb.d/
但问题是这个文件是在没有变量值的情况下复制的


如何传递这些变量?

什么是“复制而不使用变量值”。。。只有当脚本在容器中运行时,脚本才会选择您正在设置的环境变量
$ENV
。启动容器后,在容器中放入一个shell,然后键入
echo$ENV
,它将拾取您在
$APP_ENV
.Hmmm>中设置的任何值。这是真的。我ve通过sh运行此脚本,并创建了我的数据库。但为什么这个脚本不是由容器启动的呢?从文档中,如果要在从该映像派生的映像中执行其他初始化,请在/docker entrypoint initdb.d下添加一个或多个*.sql、*.sql.gz或*.sh脚本(如有必要,请创建目录)。入口点调用initdb创建默认postgres用户和数据库后,它将运行任何*.sql文件,运行任何可执行的*.sh脚本,并生成任何不可执行的*.sh脚本:
如果[-z“$database\u已经存在”],则在下面进行检查:;然后
加上注释“仅在空数据目录上运行初始化”。我不知道这是不是弄脏了这里的东西。我在docker compose或DOCKERFILE中没有看到任何东西表明已经设置了数据库(比如通过卷装载…)maybee这行?卷:-./docker/postgres/pg data:/var/lib/postgresql/data:rw“复制时没有变量值”是什么意思。。。只有当脚本在容器中运行时,脚本才会选择您正在设置的环境变量
$ENV
。启动容器后,在容器中放入一个shell,然后键入
echo$ENV
,它将拾取您在
$APP_ENV
.Hmmm>中设置的任何值。这是真的。我ve通过sh运行此脚本,并创建了我的数据库。但为什么这个脚本不是由容器启动的呢?从文档中,如果要在从该映像派生的映像中执行其他初始化,请在/docker entrypoint initdb.d下添加一个或多个*.sql、*.sql.gz或*.sh脚本(如有必要,请创建目录)。入口点调用initdb创建默认postgres用户和数据库后,它将运行任何*.sql文件,运行任何可执行的*.sh脚本,并生成任何不可执行的*.sh脚本:
如果[-z“$database\u已经存在”],则在下面进行检查:;然后
加上注释“仅在空数据目录上运行初始化”。我不知道这是不是弄脏了这里的东西。我在docker compose或DOCKERFILE中没有看到任何东西表明已经设置了数据库(比如通过卷装载…)maybee这行?卷:-./docker/postgres/pg data:/var/lib/postgresql/data:rw