Django无法在Docker安装中连接到Postgres
我在使用Django和Postgres的Docker中设置了一个应用程序。 我无法从应用程序连接到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"?
这是我的Dockerfile:
FROM python:2.7 ADD requirements.txt /app/requirements.txt WORKDIR /app/ RUN pip install -r requirements.txt
我的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
和Django中的数据库设置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
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
Django v1.10.5
Docker for Mac v1.13.1
docker-compose v 1.11.1
这里是日志:
-
url: https : //gist.github.com/steven-mercatante/912ca964fd05bee2c835b1ac5586c154
-
db: https : //gist.github.com/steven-mercatante/4c9a03bfc4f2e90f4b9931bdc185652f
原来问题是,在启动Django应用程序之前,Postgres还没有完全启动。 在启动Web服务器之前等待几秒钟,这很容易解决。 我将我的web
服务的command
设置为./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
编辑
这种方法可能不够好,具体取决于你的应用程序 – 大部分时间睡眠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
- 如何在Docker容器内访问主机上的postgres数据库?
- uWSGI通过Docker的Supervisord服务应用程序
- Django&WordPress的 – wp-adminredirect问题
- 如何在fig文件中提到多个django需求文件,用于跨dev,docker和prod服务器的docker部署?
- docker-compoes.yml设置与Django + Gunicorn + NGINX不适用于`docker-compose up`
- 在Docker容器中运行Django应用程序时获取502错误的网关?
- 具有Newrelic Python代理和Supervisord的Docker容器不发送数据
- Docker Django无法连接到服务器:连接被拒绝
- Docker和Django manage.py