无法连接到Gitlab CI中的postgres

时间:2020-03-02 12:59:18

标签: postgresql docker gitlab gitlab-ci

我正在尝试使用GitLab CI PostgreSQL进行集成测试,但是它不起作用。

这是阶段的代码:

integration_test:
  stage: test
  tags:
    - custom_tag
  services: 
    - postgres
  variables: 
    POSTGRES_DB: test
    POSTGRES_HOST: postgres
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: postgres
    POSTGRES_HOST_AUTH_METHOD: trust
  script:
    - docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} ${DOCKER_REGISTRY}
    - docker pull ${DOCKER_IMAGE_CI}
    - export PGPASSWORD=${POSTGRES_PASSWORD}
    - docker run --rm postgres psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;" 

它返回如下错误:

psql:错误:无法连接到服务器:无法将主机名“ postgres”转换为地址:名称或服务未知 有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您的管道看起来像它在gitlab服务中使用Shell executor。

命令docker run --rm postgres <docker command>不会自动连接到postgres网络。您可以尝试使用--link postgres和更多详细信息here运行docker映像。请注意,链接是旧功能,将来可能会删除。

我个人会尝试使用docker image运行管道作业。如果您的图片未公开显示,则可以使用DOCKER_AUTH_CONFIG

如果您将dockerRunner与password protected image一起使用,则Yaml看起来像:

integration_test:
  image: ${DOCKER_IMAGE_CI}
  stage: test
  tags:
    - custom_tag
  services: 
    - postgres
  variables: 
    POSTGRES_DB: test
    POSTGRES_HOST: postgres
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: postgres
    POSTGRES_HOST_AUTH_METHOD: trust
  script:
    - PGPASSWORD=${POSTGRES_PASSWORD} psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;" 

DOCKER_AUTH_CONFIG环境变量如下(gitlab docs):

{
    "auths": {
        "${DOCKER_REGISTRY}": {
            "auth": "(Base64 content from ${DOCKER_USER}:${DOCKER_PASSWORD})"
        }
    }
}

并使用echo -n "${DOCKER_USER}:${DOCKER_PASSWORD}" | base64

来生成base64身份验证

答案 1 :(得分:0)

也许最好看一下Docker化测试功能。这种方法还可以通过Docker桥接器更好地控制网络。 这样,您的配置可能如下所示:

.gitlab-ci.yml

stages:
 - test
before_script:
 - docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWORD} ${DOCKER_REGISTRY}
integration_test:
  stage: test
  script:
    - docker-compose build
    - docker-compose up

docker-compose.yml

version: '3'
networks:
  database:
services:
  postgres-db:
    image: ${DOCKER_IMAGE_CI}
    networks:
      - database
    container_name: postgres

  test-container:
    build:
      context: .
      dockerfile: Dockerfile
    networks:
      - database
    container_name: testcon

Dockerfile

FROM postgres
ENV POSTGRES_DB=test \
    POSTGRES_HOST=postgres \
    POSTGRES_USER=postgres \
    POSTGRES_PASSWORD=postgres \
    POSTGRES_HOST_AUTH_METHOD=trust
CMD psql -h ${POSTGRES_HOST} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c "SELECT 'OK' AS status;"