如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?

Posted

技术标签:

【中文标题】如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?【英文标题】:How to attach a PostgreSQL volume to a Docker image generated with SBT native packager? 【发布时间】:2019-11-12 20:53:02 【问题描述】:

我希望能够在 pre-prod 环境中部署我的应用程序,以便使用将公开 PostgreSQL 实例的 Docker 卷进行集成测试。我正在使用 Scala v2.12.8 和 Play v2.7。

查看 SBT 原生打包程序的 environment settings 似乎可以定义 dockerExposedVolumes 以附加数据库。

使用普通的 Docker 撰写文件,我会这样做:

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

此配置取自SO answer。

我尝试搜索配置示例,但到目前为止我没有找到任何有用的东西。现在我想知道我应该如何定义一个新的 docker 卷,然后将它准确地暴露给 SBT 创建的 Docker 映像?


有效的解决方案

最终版本。我已经对其进行了全面测试,它可以在 TCP 端口 5433 上公开数据库。

# https://docs.docker.com/samples/library/postgres/
version: "3"
services:
  app-pgsql:
    image: postgres:9.6
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=yourPasswordHere
      - POSTGRES_DB=yourDatabaseNameHere
      - POSTGRES_INITDB_ARGS="--encoding=UTF8"
    ports:
      - "5433:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes: 
  pgdata:
    driver: local

使用sbt dockerComposeUp -useStaticPorts 启动docker compose,然后使用docker ps -a 检查容器是否已实际暴露。此外,使用dockerComposeUpdockerComposeInstances 提供的命令检查日志文件。

【问题讨论】:

为什么不在自己的 docker 镜像中使用 postgres? 我想使用sbt docker:publishLocal 创建并附加一个数据库图像。那可行吗?否则,你能指出我正确的方向吗?我应该定义一个包含 PostgreSQL 映像的 docker compose 文件吗? 【参考方案1】:

有一个 sbt 插件可以帮助您实现这一目标:

sbt-docker-compose

你可以将你的数据库添加到一个 docker compose 文件中,你可以在 sbt 中运行所有的东西。

这是一个 Docker 标准。以下是如何为 Postgres 执行此操作的说明:

[run_postgresql_docker_compose][2]

该示例中的docker-compose.yml

version: '3'
services:
mydb:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
ports:
         - 5432:5432/tc

volumes:
db-data:
driver: local

由于这是 Docker 的标准方式,您会发现更多示例。

【讨论】:

我想我可能从this example开始。您能否添加一个示例来说明此撰写文件的外观? 查看我调整后的示例 显然容器会在 dockerComposeUp 之后立即重新启动或停止。你知道为什么会这样吗? 你检查过日志吗? postres docker镜像的Docker-Log 查看日志发现- POSTGRES_INITDB_ARGS="--encoding=UTF8 --locale=en_US.UTF8"不是有效的服务器编码名称。将其更改为 encoding=UTF8 似乎已经解决了这个问题。感谢您的支持。我接受了你的回复。

以上是关于如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?的主要内容,如果未能解决你的问题,请参考以下文章

如何将设置附加到 sbt 项目?

如何阻止 sbt package 命令将哈希附加到 jar 的名称

Amazon EMR:将 EBS 卷附加到实例时如何确保使用该卷

JClouds:如何将新卷附加到 AWS EC2 实例

如何使用 Sequelize + PostgreSQL 将项目附加到数组值

如何将新项目附加到 PostgreSQL 中的数组类型列中