将环境变量与 docker-composer 运行的 Postgres 初始化脚本一起使用

问题描述 投票:0回答:3

我创建了一个数据库初始化脚本,用于创建数据库并向特定表添加条目。

insert into user (email) values (${USER_EMAIL})

我的 docker-compose 文件与此类似:

version: '3.7'
services:
    postgres:
        image: postgres:10.5
        restart: always
        environment: 
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        logging:
          options:
            max-size: 10m
            max-file: "3"
        ports:
          - '5438:5432'
        volumes:
          - ./postgres-data:/var/lib/postgresql/data
          # copy the sql script to create tables
          - ./sql/create_tables.sql:/docker-entrypoint-initdb.d/create_tables.sql
          # copy the sql script to fill tables
          - ./sql/fill_tables.sql:/docker-entrypoint-initdb.d/fill_tables.sql

USER_EMAIL 是一个环境变量,未在脚本中设置。正确的做法是什么?

docker docker-compose
3个回答
0
投票
version: '3.8'

services:
  db:
    image: postgres:14-alpine
    environment:
      POSTGRES_PASSWORD: mysecretpassword
      POSTGRES_DB: mydb
      TABLENAME: mytable
    volumes:
      - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
    ports:
      - "5432:5432"

在initdb.sh中,直接使用shell脚本中的查询,这是在shell脚本中使用env变量的唯一方法

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE TABLE $TABLENAME (
        id SERIAL PRIMARY KEY,
        name VARCHAR($100),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
EOSQL

-1
投票

USER_EMAIL
在 sql 文件中不可用。我想你已经尝试过了。尝试使用
envsubst
。所以类似

command: >
  /bin/bash -c "envsubst < '$USER\_EMAIL' > ./initdb/fill_tables.sql"

我还没有尝试过拉取那个 pg 图像。所以不确定里面是否有

envsubst


-2
投票

如果您想为 USER_EMAIL 指定一个值,您只需将其添加到环境部分即可。

version: '3.7'
services:
    postgres:
        image: postgres:10.5
        restart: always
        environment: 
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
          - USER_EMAIL
        logging:
          options:
            max-size: 10m
            max-file: "3"
        ports:
          - '5438:5432'
        volumes:
          - ./postgres-data:/var/lib/postgresql/data
          # copy the sql script to create tables
          - ./sql/create_tables.sql:/docker-entrypoint-initdb.d/create_tables.sql
          # copy the sql script to fill tables
          - ./sql/fill_tables.sql:/docker-entrypoint-initdb.d/fill_tables.sql

在您的脚本中只需为 USER_EMAIL 设置一个值。

© www.soinside.com 2019 - 2024. All rights reserved.