Nano Hash - криптовалюты, майнинг, программирование

Почему у меня возникают проблемы с подключением между docker и postgresql?

Я новичок в докере, и я не знаю, почему проблема не запускает мой скрипт python в докере. Вот как я создаю свой docker-compose.yml

version: "3.6"
services:
  app :
    build: ./app/
  db:
    build: ./database/

Вот ошибка:

File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 127, in connect
app_1  |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
app_1  | sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
app_1  |        Is the server running on host "127.0.0.1" and accepting
app_1  |        TCP/IP connections on port 5432?

при запуске docker-compose ps:

             Name                            Command               State     Ports  
------------------------------------------------------------------------------------
542132_app_final_db_1   docker-entrypoint.sh postgres    Up       5432/tcp
app_1               python abc ...               Exit 1

Как мне это решить? Пожалуйста помоги. Я новичок в Docker/Docker-compose. Спасибо!


  • Я думаю, вы должны использовать имя контейнера вместо 127.0.01. Попробуйте db в информации о подключении к базе данных, которая является именем в вашем файле компоновки. 26.03.2021
  • @Saeed Я использую docker-compose up --build для запуска. 26.03.2021
  • @Саймон Убунту 18.04 26.03.2021
  • Также см. Сеть в Compose в документации Docker, в которой содержится много подробностей о соединении между контейнерами. . 26.03.2021
  • Кажется, вы можете найти свой ответ по причине, по которой ваш вопрос закрыт 26.03.2021

Ответы:


1

Я полагаю, вы не настроили сеть докеров как хост-сеть (контейнеры живут на том же сетевом интерфейсе хост-машины). Вам либо нужно подключить контейнеры по ссылке в файле docker-compose.yml, либо вам нужно поместить контейнеры в пользовательскую сеть (не в сеть по умолчанию). Я только что прочитал, что это значение по умолчанию, поэтому вам может не понадобиться ссылка. Кроме того, вам нужно приложение Python для подключения к имени хоста базы данных, соответственно. связанное имя:

В вашем случае к мерам стандартного решения необходимо принять следующие меры:

Настройка подключения между приложением и базой данных

version: "3.6"
services:
  app :
    build: ./app/
    links:
      - db:database
  db:
    build: ./database/

настройте правильное подключение к базе данных в приложении

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

Альтернативные решения

  • используйте сеть для создания пользовательской сети, чтобы у вас было разрешение DNS и вы могли использовать db: 5432 без ссылки
  • использовать хост-сеть (docker run --networking host). Не уверен, что это возможно в докере.

См. https://docs.docker.com/compose/networking/.

26.03.2021
  • Я изменил часть создания докера и добавил ссылки... однако это все равно не помогло. 26.03.2021
  • Вы изменили URL-адрес подключения postgres в своем приложении? 26.03.2021
  • links: совершенно не нужен в современном Docker; сеть default, которую предоставляет вам Compose, будет работать нормально. 26.03.2021
  • если вы не хотите иметь псевдоним для своей базы данных, верно. 26.03.2021
  • @DavidMaze сети по умолчанию ?? извините, я вас не понял. 26.03.2021
  • Если вы читали Сеть в Compose (последняя ссылка в ответе), Compose неявно предоставляет networks: [default] для служб, которые не объявляют ничего другого. В документации Docker также говорится о мосте по умолчанию и определяемом пользователем мосте, но сбивает с толку то, что сеть Compose default является определяемым пользователем мостом, а межконтейнерный DNS работает так, как вы ожидаете. В большинстве случаев ваш файл docker-compose.yml вообще не должен упоминать networks:. 26.03.2021
  • Вашему приложению необходимо подключиться к базе данных host db. И вам может понадобиться создать пользователя БД, как указано в сообщении выше. 26.03.2021
  • Как выглядят ваши Dockerfiles? 26.03.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..