我创建了一个数据库初始化脚本,用于创建数据库并向特定表添加条目。
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 是一个环境变量,未在脚本中设置。正确的做法是什么?
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
USER_EMAIL
在 sql 文件中不可用。我想你已经尝试过了。尝试使用 envsubst
。所以类似
command: >
/bin/bash -c "envsubst < '$USER\_EMAIL' > ./initdb/fill_tables.sql"
我还没有尝试过拉取那个 pg 图像。所以不确定里面是否有
envsubst
。
如果您想为 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 设置一个值。