与docker compose存在网络问题

与docker compose存在网络问题,docker,docker-compose,Docker,Docker Compose,我正在尝试使用以下配置: docker-compose.yml version: "3" services: web: build: . ports: - "3000:3000" depends_on: - db db: image: onjin/alpine-postgres environment: POSTGRES_PASSWORD: password 另一个文件是Dockerfile: FROM alp

我正在尝试使用以下配置:

docker-compose.yml

version: "3"
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: onjin/alpine-postgres
    environment:
      POSTGRES_PASSWORD: password
另一个文件是Dockerfile:

FROM alpine

RUN apk update && apk add --no-cache postgresql-client
COPY Bot/ /Bot

ENV PGHOST=db PGPASSWORD=password

RUN psql -h "$PGHOST" -f /Bot/test/database_schema.sql
我不知道为什么在运行“docker compose up”时总是出现此错误:

psql:无法将主机名“db”转换为地址:名称不正确 决心


有人能帮我调试一下吗?“db”主机名似乎没有在docker环境中传播,但不知道其原因。

您看到的问题与以下事实有关:docker composer以与yaml文件中定义的顺序相同的顺序运行服务。因此,基本上运行web服务db服务的时刻还不存在,所以它的主机名是不可解析的

如果更改docker-compose.yaml中的顺序:

version: "2"

services:
   db:
    image: onjin/alpine-postgres
    environment:
      POSTGRES_PASSWORD: password 
   web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - "db"
    tty: true
然后运行docker compose up-d您将不再看到错误,服务将启动:

sudo docker-compose ps
    Name                   Command               State           Ports          
-------------------------------------------------------------------------------
db_1    /docker-entrypoint.sh postgres   Up      5432/tcp               
web_1   /bin/sh                          Up      0.0.0.0:3000->3000/tcp 
并且主机名可以正确解析:

sudo docker-compose run web "ping" "db"
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.101 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.097 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.106 ms

依赖于
保证容器已启动,但不保证数据库已准备好接收连接。容器启动后,Postgres需要一段时间才能准备就绪。请尝试查看日志,并尝试将
exec
插入图像中,在您给Postrgres一些时间后手动运行该命令。@标记但主机名应该在数据库未完全启动的情况下解析,不是吗?对我来说奇怪的是,不同的组成(来自Docker网站的示例)即使他们有DB+Python,也能正常工作。只是我自己的项目没有。