Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python docker compose与postgres的Django连接_Python_Django_Postgresql_Docker_Docker Compose - Fatal编程技术网

Python docker compose与postgres的Django连接

Python docker compose与postgres的Django连接,python,django,postgresql,docker,docker-compose,Python,Django,Postgresql,Docker,Docker Compose,我的django项目无法连接到postgres数据库容器。我该怎么办 它在命令python manage.py collectstatic--noinput&&python manage.py makemigrations blog&&python manage.py migrate时崩溃。 我知道docker run命令创建了一个新的容器,但我有更多的命令 docker-compose.yml中的一个由bash创建。它应该有用,不是吗 我的Dockerfile: FROM python:3.6

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

它在命令
python manage.py collectstatic--noinput&&python manage.py makemigrations blog&&python manage.py migrate
时崩溃。 我知道docker run命令创建了一个新的容器,但我有更多的命令 docker-compose.yml中的一个由bash创建。它应该有用,不是吗

我的
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"
settings.py

...

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

...
docker compose up的输出--构建

web_1  |        TCP/IP connections on port 5432?
web_1  | could not connect to server: Connection refused
web_1  |        Is the server running on host "localhost" (127.0.0.1) and accepting
web_1  |        TCP/IP connections on port 5432?
web_1  |
heckblog_web_1 exited with code 1
我使用: 视窗10 Docker 17.03.0-ce-win1-(10296) docker compose版本1.11.2 Django==1.10.6 psycopg2==2.7.1


感谢您的回答

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

这意味着您的数据库无法在本地主机上访问,但您可以通过服务名称“db”访问它。在settings.py中更改此行:

    'HOST': 'localhost',
致:


以下是对我有效的方法:

以书面形式:

在设置中:


是的,这就是我错过的。非常感谢。我正在主机上运行
postgres
,即我的
MacOS
。我的
docker compose.yml中有
network\u模式:host
,但是我的dockenized django应用程序仍然失败,尽管运行了
postgres
,但同样的错误,即使我的
host
localhost
@saadi,这里的问题和答案在使用主机联网时不适用。如果您可以避免,我也强烈建议您不要使用主机联网。@BMitch您可以建议使用
网络\u主机的任何其他替代方案吗?比如说,如果postgres服务安装在操作系统中,我想在docker映像中使用它,那么我应该在
host
旁边放置什么,而不是
localhost
,因为
localhost
显然无法工作,因为它安装在操作系统中docker@saadi首先将依赖项移动到docker中。他们使用docker网络。你在这里的评论似乎是一个不同的问题,而不是澄清上述问题的答案。请使用“提问”链接提出新问题或搜索有关从容器内访问主机服务的问题。
    'HOST': 'localhost',
    'HOST': 'db',
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,
 }
}