为了账号安全,请及时绑定邮箱和手机立即绑定

PGHOST for GitLab pipeline with docker:

PGHOST for GitLab pipeline with docker:

Go
森栏 2022-11-23 13:54:23

我有一个 docker-compose 文件,它初始化 postgres 和 postgres 迁移服务。我想在 gitlab 管道中针对我的 docker-compose baked postgres 服务运行测试,但我无法通过本地主机连接到 pg_db。在我的代码中,我使用 pgx 包。在我的本地机器上,使用 localhost 作为 PGHOST 环境变量没有问题。


所以我的主要问题是我的测试将哪个主机放入 PGHOST 变量以用于 gitlab 管道内的 postgres 连接。


docker-compose.yml


version: "3.3"

services:

    pg_db:

      container_name: pg_db

      image: postgres:13.2-alpine

      environment:

        - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

        - POSTGRES_USER=${POSTGRES_USER}

        - POSTGRES_DB=${POSTGRES_DB}

        - POSTGRES_SSLMODE=${POSTGRES_SSLMODE}

        - POSTGRES_HOST_AUTH_METHOD=${POSTGRES_HOST_AUTH_METHOD}

      ports:

        - ${POSTGRES_PORT}:5432

      restart: always

      deploy:

        resources:

          limits:

            cpus: '1'

            memory: 4G

      networks:

        - postgres

        - backend


    #init db

    store-init:

      image: x:latest

      container_name: store-init

      environment:

        - PGHOST=pg_db

        - PGUSER=${POSTGRES_USER}

        - PGPASSWORD=${POSTGRES_PASSWORD}

        - PGDATABASE=${POSTGRES_DB}

        - PGPORT=${POSTGRES_PORT}

      restart: on-failure

      depends_on:

        - pg_db

      networks:

        - postgres

        - backend


networks:

  backend:

  postgres:

    driver: bridge


查看完整描述

1 回答

?
慕哥6287543

TA贡献1513条经验 获得超10个赞

在本地机器上运行容器和在 GitLab 中运行它们之间的重要区别之一docker:dind是容器在“本地主机”上不可用——它们在docker:dind容器上可用。


如果你想与这个容器交谈,在你的场景中,postgres 容器将可用docker:5432(是你的 postgres 容器具有其端口映射docker的容器的主机名)。docker:dind


用简单的 HTTP 服务容器说明

作为一个简化的示例,如果您要strm/helloworld-http使用端口映射在本地运行容器,则以下工作:


docker run -d --rm -p 80:80 strm/helloworld-http

# give it some time to startup

curl http://localhost  # this works

但是,GitLab 中的相同设置不会:


myjob:

  variables:  # these variables are not necessarily required

    DOCKER_TLS_CERTDIR: ""

    DOCKER_HOST: "tcp://docker:2375"

  services:

    - docker:dind

  script:

    - docker run -d --rm -p 80:80 strm/helloworld-http

    - sleep 10

    - curl http://localhost  # Fails!

一种解决方法是改用docker主机名:


script:

    - docker run -d --rm -p 80:80 strm/helloworld-http

    - sleep 10

    - curl http://docker  # works!


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信