我正在处理一个项目,该项目使用express作为服务器,并使用postgres作为数据库来学习docker。 服务器取决于要启动的数据库。 我第一次使用docker-compose up时一切正常,但是当我重新启动它时 (docker-compose down和docker-compose up),它表示端口出了问题
version: '3'
services:
db:
image: postgres:10
ports:
- "5433:5432"
environment:
POSTGRES_USER: 'Donald'
POSTGRES_PASSWORD: 'Aa123456'
POSTGRES_DB: 'twitter'
backend:
build: twitter
ports:
- "3000:3000"
depends_on:
- db
environment:
PGHOST: "db"
PGPORT: '5432'
PGDATABASE: 'twitter'
PGUSER: 'Donald'
PGPASSWORD: 'Aa123456'
错误
{ Error: connect ECONNREFUSED 172.19.0.2:5432
backend_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1117:14)
backend_1 | errno: 'ECONNREFUSED',
backend_1 | code: 'ECONNREFUSED',
backend_1 | syscall: 'connect',
backend_1 | address: '172.19.0.2',
backend_1 | port: 5432 }
在docker-compose之前端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b000b9a02257 excer_backend "node server" 5 minutes ago Up 3 minutes 0.0.0.0:3000->3000/tcp excer_backend_1
40ca65adcc46 postgres:10 "docker-entrypoint.s…" 5 minutes ago Up 3 minutes 0.0.0.0:5433->5432/tcp excer_db_1
在我使用docker-compose下来并查看所有干净的端口之后,没有剩余的开放端口
当我使用docker-compose up时,我发现了一个非常有趣的东西,如果我使用ctr + c并再次使用compose up,它在重新启动docker时仍然可以正常工作,但是当我使用 docker-compose时,它仍然可以正常工作下显示错误。 我尝试了重新启动docker和ctr + c并组合的人组合 一切正常,但是一旦我使用docker-compose降低了剂量,为什么会这样?
答案 0 :(得分:2)
数据库很可能还没有运行 。
当您执行docker-compose down
时,它将删除该容器,并且由于您没有使用卷来保持持久性,因此数据库必须再次执行其初始化过程,这将花费几秒钟的时间(因此当您ctrl+c
和docker-compose up
)。
请注意,depends_on
不会等到数据库启动。您必须在后端容器中使用类似wait-on
的东西。
另一种解决方案是对DB容器使用卷挂载。