Testdriven.io Как исправить «Имя или служба неизвестна» во время запуска докера?

testdriven.io

docker build -f project/Dockerfile.prod -t registry.heroku.com/mighty-savannah-85236/web ./project

Успешно построен 3df1e0c4eea4

Успешно помечен Registration.heroku.com/mighty-savannah-85236/web:latest

docker run --name fastapi-tdd -e PORT=8765 -e DATABASE_URL=sqlite://sqlite.db -p 5003:8765 registry.heroku.com/mighty-savannah-85236/web:latest

nc: getaddrinfo for host "web-db" port 5432: Name or service not known

файл для создания докеров

services:

  web:
    build: ./project
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
    volumes:
      - ./project:/usr/src/app
    ports:
      - 8004:8000
    environment:
      - ENVIRONMENT=dev
      - TESTING=0
      - DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev        
      - DATABASE_TEST_URL=postgres://postgres:postgres@web-db:5432/web_test  
    depends_on:   
      - web-db

  web-db:
    build:
      context: ./project/db
      dockerfile: Dockerfile
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваш контейнер пытается подключиться к web-db:5432, что, учитывая порт, вероятно, является сервером базы данных Postgres. И поскольку web-db не является реальным доменом, скорее всего, должен быть другой контейнер с именем web-db, который, вероятно, должен быть базой данных Postgres, к которой ваш контейнер хочет подключиться.

Это соединение будет работать только в том случае, если оба контейнера — тот, который вы запускаете, и контейнер базы данных Postgres — находятся в одном и том же определяемая пользователем сеть Docker, так как только тогда работает Обнаружение службы Docker. Возможно, вы захотите взглянуть на Документация по докеру для этого.

Но по сути вам нужно создать сеть Docker, используя

docker network create my-network

а затем подключите оба контейнера — опять же, ваш контейнер и базу данных Postgres — к этой сети, используя опцию --network. Кроме того, ваш контейнер Postgres должен называться web-db, чтобы обнаружение службы работало.

Таким образом, скелет команды для запуска БД будет следующим:

docker run --name web-db --network my-network -p 5432:5432 your-database-image

Команда для запуска вашего приложения будет

docker run --name fastapi-tdd --network my-network -e PORT=8765 -e DATABASE_URL=sqlite://sqlite.db -p 5003:8765 registry.heroku.com/mighty-savannah-85236/web:latest

Также стоит изучить Docker-компоновать, чтобы упростить весь этот процесс.

Редактировать

Теперь к вашему файлу docker-compose.yaml применяется то же правило. Оба контейнера должны находиться в одном определяемом пользователем сетевом мосту, который можно объявить с помощью networks: (помните: не помещайте его в services:).

services:

  web:
    build: ./project
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
    volumes:
      - ./project:/usr/src/app
    # attach this container to the network
    networks:
      - my-network
    ports:
      - 8004:8000
    environment:
      - ENVIRONMENT=dev
      - TESTING=0
      - DATABASE_URL=postgres://postgres:postgres@web-db:5432/web_dev        
      - DATABASE_TEST_URL=postgres://postgres:postgres@web-db:5432/web_test  
    depends_on:   
      - web-db

  web-db:
    # attach this container to the network
    networks:
      - my-network
    # name this container web-db
    container_name: web-db
    build:
      context: ./project/db
      dockerfile: Dockerfile
    expose:
      - 5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

# declare the network ressource
networks:
  my-network

Теперь подключение должно быть возможно. Имейте в виду, что вам также необходимо правильно настроить PostgreSQL, чтобы вы могли подключиться к нему, настроив listen_address='*' в postgresql.conf.

да, у меня уже есть файл для создания докеров.

user2373505 21.03.2022 01:00

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

Mushroomator 21.03.2022 01:03

Если у вас уже есть файл Compose, нужны ли вам отдельные команды docker (можно docker-compose build && docker-compose up -d)? Compose предоставляет сеть с именем default (см. Сеть в Compose, и docker network ls покажет ее вам, поэтому, если вам нужна опция docker run --net, вам не нужно вручную создавать отдельную сеть.

David Maze 21.03.2022 01:52

Да, конечно. Теперь это немного вводит в заблуждение, поскольку вопрос был довольно сильно отредактирован и сначала вообще не упоминался файл для создания докеров.

Mushroomator 21.03.2022 01:58

@ user2373505, пожалуйста, подтвердите ответ, если это сработало для вас :)

Mushroomator 21.03.2022 13:52

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

user2373505 22.03.2022 21:35

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