5

devcontainer.json我使用and设置了一个 Github 代码空间环境docker-compose.yaml。一切正常,但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 数据在容器构建之间持续存在?

4

5 回答 5

2

另一种选择是研究使用Spawn。(免责声明 - 我是开发它的开发人员之一)。

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

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

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

于 2021-09-30T12:59:36.273 回答
1

根据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 :代码空间中或在容器卷中使用克隆存储库时尚不支持。

解决方法:

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

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

这里的 <your_public_cloud> 可以是 google drive、aws 或您有权下载该卷的任何端点。它也是您需要保持的音量。

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

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

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

希望这能缓解您的问题,祝您编码愉快!

于 2021-09-24T21:18:48.337 回答
0

由于您无权访问 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 依赖项也是如此。

卷,网络等...

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

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

/local/workspace/postgres-data/

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

./postgres-data

检查权限,您的用户可能不存在于容器中。

结果,您的撰写文件变为:

  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
于 2021-09-20T14:22:32.447 回答
0

只要您不删除卷,docker-compose down --volumes例如,数据应该保持不变。

我遇到过同样的问题; 事实证明,我docker system prune -af每 15 分钟运行一次 crontab!

于 2021-09-20T14:08:01.837 回答
0

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

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

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

事实上,postgres 文档在他们的例子中就是这样做的。请参阅 PGDATA 环境变量。

于 2021-09-20T14:25:00.920 回答