Docker 中的 Postgres;每次启动容器时重新加载数据库/初始化脚本

4
根据官方的postgres docker镜像,您可以设置一个入口点,将初始化脚本放在其中。这个方法很好用。对于开发/测试,我想在每次容器启动时都有一个干净的数据库,而不仅仅是第一次启动时。 docker-entrypoint-initdb.d中的所有脚本仅运行一次(容器第一次启动时)。有没有一种简单的方法通过docker-compose每次启动容器都执行脚本?我在每个CREATE TABLE之前加上了DROP TABLE IF EXISTS,因此即使在新的启动时也可以使用.sql脚本。若需要,以下是docker-compose的相关部分:
postgres-myname:
    image: postgres:12.1-alpine
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres-db
    ports:
      - "54320:5432"
    build:
      context: .
      dockerfile: postgresql-config/Dockerfile
    networks:
      - my-network

1
你可能想要指定一个入口脚本 - 这里有一篇文章似乎描述了你的用例: https://success.docker.com/article/use-a-script-to-initialize-stateful-container-data - odlp
1
如果你运行 docker-compose down -v,Compose 将清理一切,包括数据库的本地状态,然后当你再次运行 up 时,它将从一个干净的状态开始。我认为没有办法指定你实际上并不关心默认卷。 - David Maze
1个回答

0
你需要一个“循环脚本”来重新启动,其中应包含:
docker-compose rm -vs postgres-myname
docker volume prune -f --filter label=protgres-myname

docker-compose up -d

在使用脚本之前,我建议先探索一下docker volume prune

我还建议将命名卷映射到postgres数据目录(/var/lib/postgresql/data),并明确删除该卷,而不是进行修剪。

# docker-compose.override.yml
postgres-myname:
    volumes:
        - pgdata:/var/lib/postgresql/data

volumes:
    - pgdata

然后

docker volume rm -f "$(basename "`/bin/pwd`")_pgdata"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接