sqlx.Connect() застрял в докере Alpine: последние

У меня есть проблема, которую мне удалось сократить до следующего кода:

package main

import (
    "fmt"
    "github.com/jmoiron/sqlx"
    _ "github.com/lib/pq"
    "os"
)

func main() {
    addr := os.Getenv("DB")
    fmt.Println("Postgres addr: " + addr)

    _, err := sqlx.Connect("postgres", addr)

    if err != nil {
        fmt.Println("Could not connect...")
    } else {
        fmt.Println("Connecting successful")
    }
}

Я установил репо с кодом и дополнительными пояснениями по адресу:

https://github.com/mraxus/mystery-golang-alpine

Когда я собираю и запускаю этот код Go с действительным URL-адресом БД в образе докера (здесь golang:latest) через docker-composeгде и вышеприведенная программа, и база данных postgres находятся в отдельных контейнерах, программа запускается, как и ожидалось:

build_1     | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable
build_1     | Connecting successful

Тем не менее, когда я запускаю ту же программу в той же настройке (docker-compose) с базовым изображением alpine:latestпрограмма просто застревает в sqlx.Connect():

alpine_1    | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable

Я понятия не имею, почему это так. Вы знаете? Я настроил проект, чтобы посмотреть, могут ли другие воспроизвести и получить ту же проблему, что и я:

https://github.com/mraxus/mystery-golang-alpine

Мне нравится слышать некоторые идеи, которые могут помочь мне решить эту проблему.

Детали моей системы:

  • macOS 10.12.6 (Sierra, MBP, середина 2015 г., 15 дюймов)
  • докер 17.06.1 1-ce-mac24

1 ответ

Правильное решение (путем реализации актуальной проблемы)

Вот и получается, что в корпоративной сети на работе установлен поисковый домен. Это влияет на разрешение имен альпийских контейнеров. Тем не менее, по умолчанию Голанг нет.

Чтобы решить эту проблему, вы можете перезаписать домен поиска контейнеров docker-compose, изменив конфигурацию:

build:
    dns_search: .
    image: image:build
    ...

alpine:
    dns_search: .
    image: image:alpine
    ...

См. https://github.com/mraxus/mystery-golang-alpine/pull/4

Альтернативное решение (не осознав актуальную проблему)

Заставив перейти к использованию cgo распознаватель имен, проблем больше нет:

В docker-compose.yml

alpine:
    image: mamarcus.org/project:alpine
    links:
        - postgres
    environment:
        DB: "postgres://postgres@postgres/postgres?sslmode=disable"
        GODEBUG: "netdns=cgo"

См. https://github.com/mraxus/mystery-golang-alpine/pull/3

Следует отметить, что это решение все еще сомнительно. В нашей реальной среде разработки, содержащей ~20 сервисов, настроенных в docker-compose, некоторые образы альпийских докеров по-прежнему не разрешаются должным образом. Но при обновлении конфигурации с помощью "правильного решения" все работало как прелесть.

Другие вопросы по тегам