testdriven.io
docker build -f project/Dockerfile.prod -t registry.heroku.com/mighty-savannah-85236/web ./project成功构建了3df1e0c4eea4
成功标记registry.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:latestnc: getaddrinfo用于主机"web-db“端口5432:名称或服务未知
船坞-合成文件
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发布于 2022-03-20 23:48:00
您的容器似乎正在尝试连接到web-db:5432,而该端口可能是Postgres数据库服务器。而且,由于web-db不是一个真正的域,所以最可能发生的情况是,应该有另一个名为web-db的容器,它可能应该是您的容器想要连接到的Postgres数据库。
但是,只有当两个容器(您正在启动的容器和Postgres数据库容器)处于同一个用户定义的Docker网络中时,这种连接才能工作,只有这样,Docker服务发现才能工作。你可能想看看这个的码头文件。
但实际上,您需要创建一个Docker网络
docker network create my-network然后使用--network选项将两个容器(再次,容器和Postgres数据库)附加到该网络。此外,您的Postgres容器必须被称为web-db,这样服务发现才能工作。
因此,启动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-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以允许您连接到它--在postgresql.conf中设置listen_address='*'。
https://stackoverflow.com/questions/71551460
复制相似问题