version: '3'
services:
server:
container_name: hotel-server
build:
dockerfile: Dockerfiles/server/Dockerfile
context: .
environment:
dbhost: db
links:
- db
depends_on:
- db
restart: always
ports:
- "3456:3456"
db:
image: "custom-postgis:latest"
container_name: hotelsdb
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: alliswell
# POSTGRES_DB: hotels
ports:
- "5437:5432"
volumes:
- hoteldata:/var/lib/postgresql/data #persistence
volumes:
hoteldata: {}
我设置custom-postgis的方式,这是一个自定义的postgres数据库容器,其中包含一些初始化脚本,我必须等待它开始。 问题在于服务器服务在数据库服务完全启动之前就已启动。
有什么解决方法吗?
答案 0 :(得分:0)
有什么解决方法吗?
是的
首先,意识到depends-on
几乎完全没有用。 Docker对您的应用程序一无所知。它无法告诉您数据库服务器实际上尚未准备好服务请求。
正确的解决方案是对应用程序进行编码,以便(a)它将重试初始数据库连接,直到准备就绪为止;以及(b)如果连接失败,它将重新连接至数据库。 (a)解决了您要解决的问题,并且(b)允许您独立于应用程序容器重新启动数据库容器。
如果您不控制应用程序容器中的代码,则可以使用类似以下内容的shell脚本包装主命令:
while ! psql -c 'select 1'; do
sleep 1
done
(设置适当的身份验证选项或设置.pgpass
文件)