Django无法在Docker设置中连接到Postgres

Ste*_*nte 6 python django postgresql docker

我在Docker中设置了一个使用Django和Postgres的应用程序.我无法从应用程序连接到Postgres.我跑的时候:

  • docker-compose run web python manage.py runserver
  • docker-compose run web python manage.py migrate

我收到以下错误:

django.db.utils.OperationalError: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Run Code Online (Sandbox Code Playgroud)

这是我的Dockerfile:

FROM python:2.7

ADD requirements.txt /app/requirements.txt

WORKDIR /app/

RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

我的docker-compose.yml:

version: '2'
services:
  db:
    image: postgres:9.4
    hostname: db
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
    ports:
      - "5432:5432"

  web:
    build:
      context: .
      dockerfile: Dockerfile
    hostname: web
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    links:
      - db
    depends_on:
      - db
    command:
      python manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

和Django中的数据库设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
Run Code Online (Sandbox Code Playgroud)

docker ps -a 说明:

e9df7e1644ce        web             "python manage.py ..."   About a minute ago   Up About a minute          0.0.0.0:8000->8000/tcp   web_1
60801d3256e4        postgres:9.4        "docker-entrypoint..."   About a minute ago   Up About a minute          0.0.0.0:5432->5432/tcp   db_1
Run Code Online (Sandbox Code Playgroud)

Django v1.10.5
Docker for Mac v1.13.1 docker
-compose v 1.11.1

这是日志:

Ste*_*nte 8

原来问题是Postgres在启动Django应用程序之前没有完全旋转.在启动Web服务器之前等待几秒钟就可以轻松解决这个问题.我command为我的web服务设置了./bin/boot.sh,该文件的内容是:

#!/bin/sh

# wait for Postgres to start
sleep 10

python manage.py migrate

python manage.py runserver 0.0.0.0:8000
Run Code Online (Sandbox Code Playgroud)

编辑

这个方法可能不够好,这取决于你的应用程序 - 大多数时候,睡眠10秒对我有效,但是postgres可能需要11秒才能启动.这是一个改进的bash文件,我从这个例子中获取了一个函数.

#!/bin/bash

# wait for Postgres to start
function postgres_ready(){
python << END
import sys
import psycopg2
try:
    conn = psycopg2.connect(dbname="postgres", user="postgres", password="postgres", host="postgres")
except psycopg2.OperationalError:
    sys.exit(-1)
sys.exit(0)
END
}

until postgres_ready; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

python manage.py migrate

gunicorn pft.wsgi:application -w 2 -b 0.0.0.0:8000 --reload
Run Code Online (Sandbox Code Playgroud)