如何在运行docker之前启动postgres

时间:2017-10-10 10:30:00

标签: postgresql docker docker-compose

我非常尴尬地问这个问题,因为它似乎是一个非常基本的问题,但不知怎的,我无法在文档中找到答案。

我有一个使用postgres的django应用程序。在docker-compose.yaml中有以下要求:

version: "2"

services:

database:
  image: postgres:9.5
  environment:
    POSTGRES_DB: ${POSTGRES_DATABASE}
    POSTGRES_USER: ${POSTGRES_USER}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    POSTGRES_DATA: /var/lib/postgresql/data/pgdata

当我运行docker镜像时: docker run -it --name myapp myimage 它不断重复:

The database is not ready.
wait for postgres to start...

我以分离模式运行postgres:docker run -it -d postgres:9.5 但它没有帮助

3 个答案:

答案 0 :(得分:3)

使用Docker Compose 2.1语法,您可以指定healthchecks来控制容器启动:

version: '2.1'

services:
    application:
        depends_on:
            database:
                condition: service_healthy

查看https://github.com/docker-library/healthcheck/tree/master/postgres以获取用于构建带健康检查的Postgres的Dockerfile示例。

答案 1 :(得分:1)

请查看此doc

第二个例子非常符合您的需求:

您可以使用ADDCOPY创建sh脚本并将其添加到您的应用容器中:

#!/bin/bash
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until psql -h "$host" -U "postgres" -c '\l'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd

然后你修改你的docker-compose.yaml:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-postgres.sh", "db", "python", "app.py"]
  db:
    image: postgres

command中,您正在使用容器的默认命令。 当然"python", "app.py"部分取决于你如何开始你的应用程序。  Fo Java就是例如"java", "-jar", "my-app.jar"等。

答案 2 :(得分:0)

启动容器的方式一切正常,但是,您遇到的问题是因为DB和APP容器一个接一个地启动,但是,DB容器需要准备DB,因此,当您的应用容器尝试访问您的数据库容器时,它还没有准备就绪,这就是您收到此错误的原因。

你有2个选择,一个是编辑你的APP Docker文件并添加WAIT 30 - 60秒左右,或者你可以自己启动数据库,等待它准备就绪然后启动你的APP容器