bash 短路在 docker compose 命令指令中不起作用

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

我正在创建一个 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
postgresql docker docker-compose
1个回答
0
投票

我认为你的问题在这里讨论:

docker-compose 在命令中使用管道

所以基本上 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
© www.soinside.com 2019 - 2024. All rights reserved.