psql:无法翻译主机名" somePostgres"解决:名称或服务未知

时间:2015-12-03 00:44:55

标签: docker docker-compose

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

  

psql:无法翻译主机名" somePostgres"解决:名称或服务未知   FAILED

     

失败:构建因异常而失败。

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

3 个答案:

答案 0 :(得分:0)

我认为最近不鼓励使用链接。

但是,如果您想让服务通过网络进行通信,那么以下是配置: 您需要将两个服务都配置为连接到该网络的网络。就像这样:

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

通过这种方式,服务将通过网络以服务名称作为地址进行通信。

答案 1 :(得分:0)

此错误的基本含义是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;
}

答案 2 :(得分:0)

我必须在 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 了解如何在 secret_key_base

中设置 secrets.yml