无法使用 Github CodeSpaces 和 Docker-Compose 保持 postgres 数据持久化

Can't keep postgres data persistent using Github CodeSpaces with Docker-Compose

我使用 devcontainer.jsondocker-compose.yaml 设置了 Github 代码空间环境。一切正常,但每次需要重建容器时,docker-compose.yml 中定义的 postgres 数据库都会丢失其数据。

这是 docker-compose.yml

的底部
      db:
        image: postgres:latest
        restart: unless-stopped
        volumes:
          - postgres-data:/var/lib/postgresql/data
        environment:
          POSTGRES_USER: test_user
          POSTGRES_DB: test_db
          POSTGRES_PASSWORD: test_pass
       
   volumes:
     postgres-data:

如您所见,我正在尝试将 postgres 数据卷映射到 postgres-data 卷,但由于某些原因这不起作用。

我做错了什么阻止 postgres 数据在容器构建之间持续存在?

只要您不删除以 docker-compose down --volumes 为例的卷,数据应该会保留。

我遇到了同样的问题;结果我每 15 分钟就放了一个 crontab 运行 docker system prune -af

由于您无权访问 VM,可能包含您的 docker-compose.yml 的目录发生了变化。

在那种情况下,卷名也可能会改变。

事实上,默认情况下,您的卷名称如下:

<directory_name>_postgres-data

你能试试命名的卷吗(从compose 3.4开始):

  db:
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: test_user
      POSTGRES_DB: test_db
      POSTGRES_PASSWORD: test_pass
       
volumes:
  postgres-data:
    external: false
    name: postgres-data

docker-compose 的文档可以在这里找到:

https://docs.docker.com/compose/compose-file/compose-file-v3/#name

编辑 1

如果您的 VM 是在每次构建时创建的,docker 依赖项也是如此。

volumes, networks, etc...

某处需要持久卷(幸存的 VM 构建)。

您可能必须在本地工作区中创建一个目录,例如:

/local/workspace/postgres-data/

根据我的理解,它变成了代码空间:

./postgres-data

Check permissions, your user may not exist in the container.

因此您的撰写文件变为:

  db:
    image: postgres:latest
    restart: unless-stopped
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: test_user
      POSTGRES_DB: test_db
      POSTGRES_PASSWORD: test_pass

您可以只挂载主机目录,而不是使用 docker 卷:

volumes:
  - /home/me/postgres_data:/var/lib/postgresql/data

这保证没有卷清理(意外或故意)破坏您的数据库。

确实 postgres docs 在他们的示例中这样做了。查看 PGDATA 环境变量。

根据 https://docs.github.com/en/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project#dockerfile , 只有 docker 图像可以从源和设置中提取,他们没有提到保证卷持久性。

并且在完成此 https://code.visualstudio.com/docs/remote/devcontainerjson-reference 之后,代码空间不支持 挂载和一些与卷相关的其他功能

workspaceMount : Not yet supported in Codespaces or when using Clone Repository in Container Volume.

解决方法:

在您的 docker 文件所在的 .devcontainer 文件夹中添加这样一行

RUN curl https://<your_public_cloud>/your_volume.vol -O

此处 可以是 google 驱动器、aws 或您有权下载卷的任何端点。它也是您需要坚持的音量。

  • 下载后,您可以将卷挂载到 postgres 服务或进行热交换。

  • 当您想要保存时,只需将卷上传到您的云存储提供商即可。

  • 每次构建时重复该过程,并在“取消构建”之前保存并上传,或者关闭您的代码空间,无论您喜欢调用什么。

希望能解决您的问题,编码愉快!

另一种选择是考虑使用 Spawn。 (免责声明 - 我是开发人员之一)。

我们在此处编写了一些关于如何将 Spawn 托管的数据库与 GitHub 代码空间一起使用的文档:https://docs.spawn.cc/blog/2021/08/01/spawn-and-codespaces

这将允许您配置一个独立于 GitHub 代码空间的数据库,并在重新启动之间保留数据。

您可以使用 Spawn 获得一些额外的功能,例如任意保存点、重置以及使用 Spawn 加载回已保存的修订 - 但为 GitHub 代码空间启动数据库和保存数据的关键功能之一它非常适合做的事情。