带有 PostgreSQL 的 CI/CD 管道因“数据库未初始化且未指定超级用户密码”错误而失败

Posted

技术标签:

【中文标题】带有 PostgreSQL 的 CI/CD 管道因“数据库未初始化且未指定超级用户密码”错误而失败【英文标题】:CI/CD pipeline with PostgreSQL failed with "Database is uninitialized and superuser password is not specified" error 【发布时间】:2020-06-01 09:30:46 【问题描述】:

我将 Bitbucket 管道与 PosgreSQL 一起用于 CI/CD。根据documentation PostgreSQL 服务在bitbucket-pipelines.yml 中的描述是这样的:

definitions:
  services:
    postgres:
      image: postgres:9.6-alpine

到目前为止,它工作得很好。但是我所有最新的管道都失败了,并出现以下错误:

   Error: Database is uninitialized and superuser password is not specified.
   You must specify POSTGRES_PASSWORD for the superuser. Use
   "-e POSTGRES_PASSWORD=password" to set it in "docker run".

   You may also use POSTGRES_HOST_AUTH_METHOD=trust to allow all connections
   without a password. This is *not* recommended. See PostgreSQL
   documentation about "trust":
   https://www.postgresql.org/docs/current/auth-trust.html

我该如何解决? bitbucket-pipelines.yml 文件没有变化,这可能是导致此类错误的原因..

【问题讨论】:

【参考方案1】:

看起来原因是 docker 镜像的更新(github issue)。最新版本不允许在没有密码的情况下从任何地方连接到数据库。所以你需要指定用户名/密码:

definitions:
  services:
    postgres:
      image: postgres:9.6-alpine
      environment:
         POSTGRES_DB: pipelines
         POSTGRES_USER: test_user
         POSTGRES_PASSWORD: test_user_password

或者如果你仍然不想使用密码,你可以设置POSTGRES_HOST_AUTH_METHOD=trust环境变量:

definitions:
  services:
    postgres:
      image: postgres:9.6-alpine
      environment:
        POSTGRES_HOST_AUTH_METHOD: trust

【讨论】:

如何打开这些设置? @LukasSalich 它在bitbucket-pipelines.yml 文件中。 最后,运行容器的错误命令存在不同的问题,因此不相关。【参考方案2】:

这是大约一周前的最新更改。避免它的一种方法是将您的 postgres 版本硬编码为不是最新的,例如更改为 postgres:9.5.18postgres:9.5.20-alpine

另一种方法是传递假密码:

services:
  db:
    image: postgres
    ports:
      - "8001:5432"
    environment:
      - POSTGRES_PASSWORD=fake_password

在此处查看讨论:https://github.com/docker-library/postgres/issues/681

【讨论】:

【参考方案3】:

如果您第一次通过 Docker 将 Django 连接到 PostgreSQL 时遇到问题,请将 POSTGRES_HOST_AUTH_METHOD: trust 添加到您的 docker-compose.yml 文件中:

db: image: postgres:11 environment: POSTGRES_HOST_AUTH_METHOD: trust

这为我解决了连接问题。

还请注意“这是推荐的。请参阅有关“信任”的 PostgreSQL 文档:https://www.postgresql.org/docs/current/auth-trust.html”

【讨论】:

如果不建议这样做,为什么建议这样做?提醒它不被推荐是好的,但也提供你推荐它的原因或提供解决它的方法。肯定会有所帮助。只是一个意见。 解决这个问题的一个好办法是为超级用户指定一个 POSTGRES_PASSWORD。您可以使用“-e POSTGRES_PASSWORD=password”在“docker run”中设置

以上是关于带有 PostgreSQL 的 CI/CD 管道因“数据库未初始化且未指定超级用户密码”错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量

SelfMutate 阶段因 CodePipeline 而失败

为合并请求触发的管道运行应用 GitLab CI/CD 管道更改

关于使用 CI / CD 管道的语义版本控制发布的一般问题

AWS Lambda - 在 CI/CD 管道中版本控制和提升 lambda 的最佳实践是啥

跨两个不同组织配置 Azure CI CD 管道