【问题标题】:psql: could not translate host name "somePostgres" to address: Name or service not knownpsql:无法将主机名“somePostgres”转换为地址:名称或服务未知
【发布时间】:2016-03-07 11:16:46
【问题描述】:

我正在 docker 中构建一个 java spring mvc 应用程序,而 dokefile 构建涉及与 postgres 容器交互。每当我运行docker-compose up 时,dockerfile 中与 postrges 交互的步骤有时会失败并出现异常

psql:无法将主机名“somePostgres”转换为地址:名称或服务未知 失败

FAILURE:构建失败并出现异常。

DockerCompose 文件:

abcdweb:
  links:
  - abcdpostgres
  build: .
  ports:
  - "8080:8080"
  volumes:
  - .:/abcd-myproj
  container_name: someWeb
abcdpostgres:
  image: postgres
  environment:
  - POSTGRES_PASSWORD=postgres
  - POSTGRES_USER=postgres
  container_name: somePostgres

somePostgres 似乎启动很快,并且没有 postgres 容器延迟加载问题。目前我正在由 docker-machine 创建的虚拟框中运行它。无法得到错误,因为它不是持久的。

PS:添加了 Dockerfile

FROM java:7
RUN apt-get update && apt-get install -y postgresql-client-9.4
ADD . ./abcd-myproj
WORKDIR /abcd-myproj
RUN ./gradlew build -x test 
RUN sh db/importdata.sh
CMD ./gradlew jettyRun

【问题讨论】:

  • 所以容器名称是somePostgres,你链接到abcdpostgres
  • 您无法链接到 dockerfile 中的其他正在运行的容器。如果你在 Dockerfile 中解释你想要做什么,我可以给你一些关于如何完成你想要的想法。
  • @BMW 是的,我想链接到 somePostgres
  • @PaulBecotte 作为一个问题,dockerfile 有时会构建并正常工作,尽管这种行为不是持久的。我添加了 dockerfile,你可以看到 ./gradlew build -x test 需要容器启动并运行,因为构建任务涉及创建和初始化数据库。我知道有多种方法可以解决这个问题,但我想知道这背后的原因行为不一致。

标签: docker docker-compose


【解决方案1】:

我认为最近不鼓励链接。

但是,如果您想让服务通过网络进行通信,那么这里是明确的配置: 您需要配置网络和两个服务以附加到该网络。是这样的:

networks:
  network:
    external: true
abcdweb:
  links:
  - abcdpostgres
  build: .
  ports:
  - "8080:8080"
  volumes:
  - .:/abcd-myproj
  container_name: someWeb
  networks:
    network: null
abcdpostgres:
  image: postgres
  environment:
  - POSTGRES_PASSWORD=postgres
  - POSTGRES_USER=postgres
  container_name: somePostgres
  networks:
    network: null

这样服务将通过网络以服务名称作为地址进行通信。

【讨论】:

    【解决方案2】:

    这个错误的基本意思是psql无法解析主机名,尝试使用ip地址代替。

    https://github.com/postgres/postgres/blob/313f56ce2d1b9dfd3483e4f39611baa27852835a/src/interfaces/libpq/fe-connect.c#L2275-L2285

    case CHT_HOST_NAME:
        ret = pg_getaddrinfo_all(ch->host, portstr, &hint,
                                 &conn->addrlist);
        if (ret || !conn->addrlist)
        {
            appendPQExpBuffer(&conn->errorMessage,
                              libpq_gettext("could not translate host name \"%s\" to address: %s\n"),
                              ch->host, gai_strerror(ret));
            goto keep_going;
        }
    break;
    

    https://github.com/postgres/postgres/blob/8255c7a5eeba8f1a38b7a431c04909bde4f5e67d/src/common/ip.c#L57-L75

    int
    pg_getaddrinfo_all(const char *hostname, const char *servname,
                       const struct addrinfo *hintp, struct addrinfo **result)
    {
        int         rc;
    
        /* not all versions of getaddrinfo() zero *result on failure */
        *result = NULL;
    
    #ifdef HAVE_UNIX_SOCKETS
        if (hintp->ai_family == AF_UNIX)
            return getaddrinfo_unix(servname, hintp, result);
    #endif
    
        /* NULL has special meaning to getaddrinfo(). */
        rc = getaddrinfo((!hostname || hostname[0] == '\0') ? NULL : hostname,
                         servname, hintp, result);
    
        return rc;
    }
    

    【讨论】:

      【解决方案3】:

      我必须将我的secret_key_base 设置为secrets.yml

      使用不正确的密钥,我的应用没有解析数据库域的权限。

      我正在 docker 中运行一个使用 secret_key_base 的 rails 应用程序。问题是我使用开发环境在生产数据库上运行该应用程序。开发环境需要开发secrete_key_base。一旦我开始使用正确的密钥,我就可以连接到数据库。

      错误在我的 rails 容器日志中显示为 Raven 2.13.0 configured not to capture errors: No host specified, no public_key specified, no project_id specified

      查看this question了解如何在secrets.yml中设置secret_key_base

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-03
        • 2021-10-16
        • 2017-05-25
        • 2017-12-16
        • 2019-07-31
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多