Django通过docker-compose连接到postgres

时间:2017-03-15 13:50:22

标签: python django postgresql docker docker-compose

我的django项目无法连接到postgres数据库容器。我应该怎么做?

它在命令Bob: - Football: 0 Julia: - Football: 1 - Golf: 38 Kevin: - Football: 47 - Golf: 0 - Tennis: 124 上崩溃了。 我知道docker run命令会创建一个新容器但我有更多命令 一个由bash在docker-compose.yml中。它应该有效,不应该吗?

我的python manage.py collectstatic --noinput && python manage.py makemigrations blog && python manage.py migrate

Dockerfile

我的FROM python:3.6-alpine MAINTAINER Name <name@domain> ENV PYTHONUNBUFFERED 1 ENV INSTALL_PATH /heckblog RUN mkdir -p $INSTALL_PATH WORKDIR $INSTALL_PATH COPY requirements.txt requirements.txt # make available run pip install psycopg2 RUN apk update && \ apk add --virtual build-deps gcc python3-dev musl-dev && \ apk add postgresql-dev RUN pip3 install -r requirements.txt # add bash into alpine linux RUN apk add --update bash && rm -rf /var/cache/apk/* COPY ./heckblog . #RUN pip install . CMD gunicorn -b 0.0.0.0:8000 --access-logfile - "config.wsgi:application"

docker-compose.yml

version: '2' services: db: image: postgres:alpine environment: POSTGRES_USER: blogdmin POSTGRES_PASSWORD: password POSTGRES_DB: heckblog PGDATA: /tmp/pgdata volumes: - postgres_data:/tmp/pgdata web: build: . command: > bash -c "sleep 10 && python manage.py collectstatic --noinput && python manage.py makemigrations blog && python manage.py migrate && echo \"from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')\" | python manage.py shell && gunicorn -b 0.0.0.0:8000 --access-logfile - --reload \"config.wsgi:application\"" volumes: - ./heckblog:/heckblog depends_on: - db environment: IN_DOCKER: 1 ports: - "80:8000" volumes: postgres_data:

settings.py

... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'heckblog', 'USER': 'blogdmin', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', # default port } } ... 的输出:

docker-compose up --build

我用: Windows 10 Docker 17.03.0-ce-win1-(10296) docker-compose版本1.11.2 Django的== 1.10.6 psycopg2 == 2.7.1。

感谢您的回答

2 个答案:

答案 0 :(得分:8)

默认情况下,docker中的每个容器都有自己的主机名和IP。当compose为您旋转容器时,默认情况下它还会将所有容器放在网络上,以允许基于DNS的发现。

这意味着您的数据库无法在localhost上访问,但您可以通过服务名称&#34; db&#34;来访问它。在settings.py中更改此行:

    'HOST': 'localhost',

为:

    'HOST': 'db',

答案 1 :(得分:1)

这对我有用:

撰写:

version: '3.7'
services: 
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes: 
        - .:/code
    ports: 
        - 8000:8000
    environment: 
        - DB_HOST=db
        - DB_NAME=web
        - DB_USER=postgres
        - DB_PASSWORD=postgres

    depends_on: 
        - db

  db:
    image: postgres:12-alpine
    volumes: 
        - postgres_data:/var/lib/postgresql/data/
    environment: 
        - POSTGRES_DB=web
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=postgres
volumes:
   postgres_data:

在设置中:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': os.environ.get('DB_NAME'),
    'USER':os.environ.get('DB_USER'),
    'PASSWORD': os.environ.get('DB_PASSWORD'),
    'HOST':os.environ.get('DB_HOST'),
    'PORT':5432,
 }
}