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
Похоже, ваш контейнер пытается подключиться к 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
.
А, ладно, даже лучше :) но действует то же правило. Вам нужна сеть, которую вы подключаете к обоим этим контейнерам. Я отредактирую свой пост, используя файл компоновки, который вы только что опубликовали.
Если у вас уже есть файл Compose, нужны ли вам отдельные команды docker
(можно docker-compose build && docker-compose up -d
)? Compose предоставляет сеть с именем default
(см. Сеть в Compose, и docker network ls
покажет ее вам, поэтому, если вам нужна опция docker run --net
, вам не нужно вручную создавать отдельную сеть.
Да, конечно. Теперь это немного вводит в заблуждение, поскольку вопрос был довольно сильно отредактирован и сначала вообще не упоминался файл для создания докеров.
@ user2373505, пожалуйста, подтвердите ответ, если это сработало для вас :)
@Mushroomator, решение подходит, но я обнаружил, что ошибка вызвана другой причиной, и я все еще изучаю ее. Я поделюсь с вами сценарием на всякий случай, если я что-то упускаю.
да, у меня уже есть файл для создания докеров.