Docker Postgres

时间:2018-08-13 18:59:08

标签: django postgresql docker docker-compose

docker-有问题。我使用Postgres作为数据库编写Django项目,并希望对其进行dockerize。所以问题来了:当我建立和建立容器时,有一个例外:

...
polls       |   Is the server running on host "postgres" (172.19.0.2) and accepting
polls       |   TCP/IP connections on port 5432?

但是如果我第二次这样做-一切正常,并且服务器已启动。

Dockerfile:

FROM python:3
ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

ADD requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/

docker-compose.yml:

version: '3'

services:
  postgres:
    image: postgres:latest
    container_name: polls_db
    env_file:
      - ./src/main/.env
    volumes:
      - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

  polls:
    build: .
    container_name: polls

    volumes:
      - .:/code
    env_file:
      - ./src/main/.env
    ports:
      - "8000:8000"
    depends_on:
      - postgres
    command: bash -c "python src/manage.py migrate && python src/manage.py runserver 0.0.0.0:8000"

1 个答案:

答案 0 :(得分:1)

就像David Maze在评论中说的那样,听起来您的数据库在启动postgres容器和实际准备建立新连接之间还没有准备好采取行动。您还已经将polls服务设置为立即开始迁移,这意味着它希望数据库在开始运行的第二秒就可用。

Docker has some suggestions for this。基本上,编写一个包装器脚本以用作您的入口点,例如:

#!/bin/bash

count=1
until [ $count -eq 5 ]
  do
     sleep 3
     python src/manage.py migrate && break
     count=$((count + 1))
  done

 if [ $count -lt 5 ]; then
  python src/manage.py runserver 0.0.0.0:8000
 fi

某些bash向导可能会发现此脚本有问题,因为我没有对其进行测试(请随意评论):)想法是,在放弃之前尝试运行迁移几次。您还可以通过psql / curl / wget使用更快的测试,我选择使用manage.py migrate,因为上述工具通常未安装在普通Docker映像上。