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, некоторые образы альпийских докеров по-прежнему не разрешаются должным образом. Но при обновлении конфигурации с помощью "правильного решения" все работало как прелесть.