我正在创建一个 postgres 容器,在 db 服务运行正常后,我运行 psql 服务,如果数据库不存在,它会简单地创建数据库。
现在在 psql 服务
command
指令中,我希望 OR 运算符的左侧以非零代码退出,然后应执行命令的右侧。如果我直接在 postgres 映像中运行命令,就会发生这种情况。但在 docker compose 文件中,短路不起作用。当左侧以非零代码退出时,它不会执行右侧。
我知道
POSTGRES_DB
env var 可以传递给 postgres 服务,但我必须以这种方式创建数据库。我已经尝试使用 sh -c "COMMAND HERE" 运行此命令
Docker 版本 27.3.1
任何帮助表示赞赏。谢谢!
psql:
image: alpine/psql:16.3
depends_on:
db:
condition: service_healthy
environment:
- PGPASSWORD=password
#https://stackoverflow.com/a/59617496/18954618
command: psql -h db -U postgres -c 'select 1' -d 'my_db' &> /dev/null || psql -d 'postgres' -h db -U postgres -tc 'create database my_db'
db:
container_name: postgres
image: postgres:13.18
restart: unless-stopped
expose:
- 5432
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
volumes:
- ./volumes/pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
我认为你的问题在这里讨论:
所以基本上 docker-compose 有管道问题 - ||
所以这段代码对我有用:
version: '3.9'
services:
psql:
image: alpine/psql:16.3
depends_on:
db:
condition: service_healthy
environment:
- PGPASSWORD=password
#https://stackoverflow.com/a/59617496/18954618
command: sh -c 'psql -h db -U postgres -c "select 1" -d "my_db" &> /dev/null || psql -d "postgres" -h db -U postgres -tc "create database my_db"'
db:
container_name: postgres
image: postgres:13.18
restart: unless-stopped
expose:
- 5432
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: postgres
volumes:
- ./volumes/pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5