与docker compose存在网络问题
我正在尝试使用以下配置: docker-compose.yml与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
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,也能正常工作。只是我自己的项目没有。