Docker-compose取决于不等到依赖服务没有完全启动

时间:2019-12-24 19:07:26

标签: postgresql docker docker-compose

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数据库容器,其中包含一些初始化脚本,我必须等待它开始。 问题在于服务器服务在数据库服务完全启动之前就已启动。

有什么解决方法吗?

1 个答案:

答案 0 :(得分:0)

  

有什么解决方法吗?

是的

首先,意识到depends-on几乎完全没有用。 Docker对您的应用程序一无所知。它无法告诉您数据库服务器实际上尚未准备好服务请求。

正确的解决方案是对应用程序进行编码,以便(a)它将重试初始数据库连接,直到准备就绪为止;以及(b)如果连接失败,它将重新连接至数据库。 (a)解决了您要解决的问题,并且(b)允许您独立于应用程序容器重新启动数据库容器。

如果您不控制应用程序容器中的代码,则可以使用类似以下内容的shell脚本包装主命令:

while ! psql -c 'select 1'; do
  sleep 1
done

(设置适当的身份验证选项或设置.pgpass文件)