Django 如何从docker容器中访问主机上的postgres数据库?

Django 如何从docker容器中访问主机上的postgres数据库?,django,postgresql,docker,docker-compose,Django,Postgresql,Docker,Docker Compose,我有一个docker compose文件和django项目,试图使用位于主机上的数据库 现在我的Dockerfile是: FROM python:3-slim ENV PYTHONUNBUFFERED 1 RUN mkdir /code. WORKDIR /code ADD . /code/ RUN pip install -r requirements.txt RUN export dockerhost=$(docker-machine ip) docker-compose.yml: v

我有一个docker compose文件和django项目,试图使用位于主机上的数据库

现在我的Dockerfile是:

FROM python:3-slim

ENV PYTHONUNBUFFERED 1

RUN mkdir /code.
WORKDIR /code
ADD . /code/
RUN pip install -r requirements.txt
RUN export dockerhost=$(docker-machine ip)
docker-compose.yml:

version: "2"

networks:
  workernetwork:
  webnetwork:

services:
  static:
    volumes:
      - /static:/static
      - /media:/media
    image: alpine:latest

  web:
    build: .
    command: bash -c "SECRET_KEY=temp_value python /code/manage.py collectstatic --noinput && python /code/manage.py migrate && /code/run_gunicorn.sh"
    volumes:
      - .:/code
    volumes_from:
      - static
    env_file:
      - secrets.env
    ports:
      - 443:443
    networks:
      - webnetwork
    extra_hosts:
      - "dockerhost:${dockerhost}"
数据库
在settings.py中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'revolution',
        'USER': get_env_setting('POSTGRES_USER'),
        'PASSWORD': get_env_setting('POSTGRES_PASSWORD'),
        'HOST': 'dockerhost',
        'PORT': 5432,
    }
}
我做错了什么


谢谢注意

我也有同样的问题。问题是netwrok之间的连接被阻塞。我通过创建一个网桥名称的网络来修复它:

docker network create \
    --driver bridge \
    --opt "com.docker.network.bridge.name"="docker_webnetwork" \
    webnetwork
我正在使用UFW作为我的防火墙。因此,允许在我创建的网络上连接到postegres端口

sudo ufw allow in on docker_webnetwork to any port 5432
然后,您可以使用webnetwork连接到主机的postgresql

要获取主机ip,我添加:

export DOCKERHOST=$(ip route | awk '/^default via /{print $3}')

在需要访问数据库的服务的命令中。

最终通过docker volume解决:

首先,创建卷:

docker volume create --name=coredb
docker-compose.yml

version: "2"

services:
  ...    
  web:
    build:
      context: .
    command: bash -c "python /code/manage.py collectstatic --noinput && python /code/manage.py migrate && /code/run_gunicorn.sh"
    volumes:
      - /static:/data/web/static
      - /media:/data/web/media
      - .:/code
    env_file:
      - ../.env
    depends_on:
      - db
  db:
    restart: always
    image: postgres
    env_file:
      - ../.env
    volumes:
      - pgdata: /var/lib/postgresql/data

volumes:
  pgdata:
    external:
      name: coredb
.env变量:

POSTGRES_DB={hidden}
POSTGRES_USER={hidden}
POSTGRES_PASSWORD={hidden}
重要: 您需要通过
docker exec-it backend_db_1 bash
手动创建数据库和用户,并遵循说明,直到
在虚拟环境中安装Django
章节