簡體   English   中英

如何從docker容器中訪問主機上的postgres數據庫?

[英]How to access postgres database on host from within docker container?

我有一個django項目的docker-compose文件,試圖使用位於主機上的數據庫。

現在我的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)

泊塢窗,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

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

泊塢窗,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手動創建數據庫和用戶,並按照說明操作,直到Install Django within a Virtual Environment章節中Install Django within a Virtual Environment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM