首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >testdriven.io如何在码头运行期间修复“名称或服务未知”?

testdriven.io如何在码头运行期间修复“名称或服务未知”?
EN

Stack Overflow用户
提问于 2022-03-20 23:33:27
回答 1查看 615关注 0票数 0

testdriven.io

代码语言:javascript
复制
docker build -f project/Dockerfile.prod -t registry.heroku.com/mighty-savannah-85236/web ./project

成功构建了3df1e0c4eea4

成功标记registry.heroku.com/mighty-savannah-85236/web:latest

代码语言:javascript
复制
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用于主机"web-db“端口5432:名称或服务未知

船坞-合成文件

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 23:48:00

您的容器似乎正在尝试连接到web-db:5432,而该端口可能是Postgres数据库服务器。而且,由于web-db不是一个真正的域,所以最可能发生的情况是,应该有另一个名为web-db的容器,它可能应该是您的容器想要连接到的Postgres数据库。

但是,只有当两个容器(您正在启动的容器和Postgres数据库容器)处于同一个用户定义的Docker网络中时,这种连接才能工作,只有这样,Docker服务发现才能工作。你可能想看看这个的码头文件

但实际上,您需要创建一个Docker网络

代码语言:javascript
复制
docker network create my-network

然后使用--network选项将两个容器(再次,容器和Postgres数据库)附加到该网络。此外,您的Postgres容器必须被称为web-db,这样服务发现才能工作。

因此,启动DB的命令的框架如下:

代码语言:javascript
复制
docker run --name web-db --network my-network -p 5432:5432 your-database-image

启动应用程序的命令是

代码语言:javascript
复制
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:中)。

代码语言:javascript
复制
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='*'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71551460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档