Docker golang gin postgres

Я пытаюсь настроить докер для приложения golang с помощью Postgres. Приложение go отлично работает в контейнере, если я удаляю/комментирую Postgres. Точно так же я могу развернуть контейнер Postgres и войти в него. Я могу сделать docker-compose up. Но когда я делаю вызов API, например, например: localhost:3000/api/admin/users. Выдает и ошибку:

error: {
        "error": "+dial tcp 127.0.0.1:5432: connect: connection refused"
    }

Строка подключения Postgres выглядит следующим образом:

connStr := fmt.Sprintf("host=postgres user=anurag password=anu_12345 dbname=bankingapp sslmode=disable")

БД, ошибка: = sql.Open ("postgres", connStr)

Докерфайл

FROM golang:1.13


WORKDIR /go/src/banking-app
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["go" , "run", "main.go"]


докер-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
  postgres:
    image: "postgres"
    environment:
      POSTGRES_USER: 'anurag'
      POSTGRES_PASSWORD: 'anu_12345'
      POSTGRES_DB: 'bankingapp'



person Anurag Bhardwaj    schedule 23.12.2019    source источник
comment
Вы пытались использовать порты в определении службы postgress? ``` изображение: postgres: последний перезапуск: всегда порты: - 5432: 5432   -  person Oras    schedule 24.12.2019
comment
@Орас, у меня есть. но я не думаю, что мне нужно. compose создать мост n/w по умолчанию. Кроме того, я могу успешно ping postgres из веб-приложения   -  person Anurag Bhardwaj    schedule 25.12.2019


Ответы (2)


Похоже, что некоторые отсутствующие порты должны быть раскрыты, как указано в портах @Oras: 5432:5432 просто добавьте его, чтобы исключить порты из проблемы, а также из-за вашей ошибки, кажется, что ваш контейнер приложения Docker зависит от контейнер базы данных, поэтому вам нужно дождаться, пока ваш контейнер базы данных будет запущен, и ваш контейнер приложения сможет его подключить, проверьте depends_on для создания докера:

https://docs.docker.com/compose/compose-file/

version: '3'
services:
web:
  build: .
  ports:
    - "3000:3000"
  depends_on:
    postgres
  restart_policy:
    condition: on-failure
  postgres:
    image: "postgres"
    ports:
      - "3000:3000"
    environment:
      POSTGRES_USER: 'anurag'
      POSTGRES_PASSWORD: 'anu_12345'
      POSTGRES_DB: 'bankingapp'

Есть несколько моментов, о которых следует помнить при использовании depend_on:

  1. depend_on не ждет, пока db и redis будут «готовы» перед запуском web — только до тех пор, пока они не будут запущены. Если вам нужно дождаться готовности службы, см. раздел Управление порядком запуска, чтобы узнать больше об этой проблеме и стратегиях ее решения.

  2. Версия 3 больше не поддерживает форму условия depend_on.

  3. Опция depend_on игнорируется при развертывании стека в режиме swarm с файлом Compose версии 3.

и, основываясь на приведенном выше примечании, вы все еще можете столкнуться с проблемой, но политика перезапуска перезапустит контейнер приложения, и вы подключитесь к базе данных.

person ROOT    schedule 25.12.2019
comment
Я склонен отличаться от вашего мнения о портах. Мне кажется, мы выставляем порты только тогда, когда нам нужно подключиться вне сети. поскольку docker-compose дает сеть моста по умолчанию, мы не делаем это, чтобы выставлять порты. depends_on предназначен только для обеспечения зависимостей контейнера. Спасибо за ваш ответ. Счастливых праздников! - person Anurag Bhardwaj; 25.12.2019
comment
Я согласен с вами, я проверил и вижу, что моя точка зрения здесь недействительна, но, возможно, для вашего случая вам понадобится пользовательский entrypoint для проверки доступности базы данных в контейнере вашего приложения и ее работоспособности. С Рождеством! тебе. - person ROOT; 25.12.2019

Я нашел ответ. Просто нужно пересобрать образ или загрузить с помощью mount. Код не обновлялся.

Извините за беспокойство.

person Anurag Bhardwaj    schedule 25.12.2019