在 docker-compose.yml 文件中创建 postgres 数据库

Jot*_*ain 4 postgresql docker docker-compose

我想在 postgres 容器启动后在 docker-compose.yml 文件中创建一个名为 Bank 的 postgres 数据库,但是当我运行时docker-compose --env-file .env -f docker-compose.yaml up -d出现此错误:/var/run/postgresql:5432 - no response...

当我删除带有选项的行时command:,一切都会正常启动,我得到:/var/run/postgresql:5432 - accepting connections

但现在,我必须在终端中逐步运行此操作:

  • docker exec -it postgres bash
  • psql -U 我的用户名
  • 创建数据库银行;
  • 并退出

我真的不希望它像那样工作,相反,我希望在 docker-compose 文件中创建数据库。(请注意,当我删除该command:选项并until pg_isready; do sleep 1; done; echo accepting;在容器内运行时,它accepting几乎立即输出)

envPOSTGRES_DB变量不起作用,用户名仍用作默认值

这是我的 docker-compose 文件:

services:
  db:
    container_name: postgres
    image: postgres
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - PGDATA=/data/postgres
    volumes:
      - db:/data/postgres
    ports:
      - "5332:5432"
    networks:
      - db
    restart: unless-stopped
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -d postgres" ]
      interval: 30s
      timeout: 10s
      retries: 5
    command: /bin/bash -c "until pg_isready -U ${POSTGRES_USER} -p 5432; do sleep 1; done; psql -U ${POSTGRES_USER} -c 'CREATE DATABASE bank;'"
networks:
  db:
    driver: bridge

volumes:
  db:
Run Code Online (Sandbox Code Playgroud)

最重要的一行是命令::

command: /bin/bash -c "until pg_isready -U ${POSTGRES_USER} -p 5432; do sleep 1; done; psql -U ${POSTGRES_USER} -c 'CREATE DATABASE bank;'"
Run Code Online (Sandbox Code Playgroud)

请帮助我执行正确的命令,以便运行时自动创建数据库docker-compose --env-file .env -f file up -d

e74*_*dbf 9

您是否考虑过使用POSTGRES_DB环境变量?

services:
  db:
    container_name: postgres
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /data/postgres
      POSTGRES_DB: bank
    volumes:
      - db:/data/postgres
    ports:
      - "5332:5432"
    networks:
      - db
    restart: unless-stopped
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -d postgres" ]
      interval: 30s
      timeout: 10s
      retries: 5
networks:
  db:
    driver: bridge

volumes:
  db:
Run Code Online (Sandbox Code Playgroud)


Dan*_* S. 5

您可以使用创建数据库脚本并将其添加为卷,如下所示:

version: '3'

services:

  db:
    image: postgres:15.3-alpine3.18
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - '5432:5432'
    volumes: 
      - ./db:/var/lib/postgresql/data
      - ./create-db.sql:/docker-entrypoint-initdb.d/create_database.sql
    networks:
      - backnet

Run Code Online (Sandbox Code Playgroud)

我的 SQL 脚本很简单,如下所示:

CREATE DATABASE some_database;

Run Code Online (Sandbox Code Playgroud)

如果您已经将卷初始化为“db”,则需要先将其删除(据我所知),因为 postgres 会声明数据库已存在并将跳过初始化。