Django通过docker-compose连接到postgres

17 浏览
0 Comments

Django通过docker-compose连接到postgres

我的Django项目无法连接到postgres数据库容器。我该怎么办?\n它在命令python manage.py collectstatic --noinput && python manage.py makemigrations blog && python manage.py migrate上崩溃了。\n我知道docker run命令会创建一个新的容器,但我在docker-compose.yml中有更多的命令,用bash一个一个运行。这应该可以工作,不是吗?\n我的:\n

FROM python:3.6-alpine
MAINTAINER Name 
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"

\n我的:\n

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:

\nsettings.py:\n

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

\ndocker-compose up --build的输出:\n

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

\n我使用:\nWindows 10\nDocker 17.03.0-ce-win1-(10296)\ndocker-compose版本1.11.2\nDjango == 1.10.6\npsycopg2 == 2.7.1。\n谢谢回答

0
0 Comments

问题的出现原因是Django连接到Postgres数据库时无法建立连接。这可能是由于以下原因之一导致的:

1. 数据库配置错误:在Django的settings.py文件中,数据库的主机名(host)被设置为"db",但是在Docker Compose文件中并没有定义名为"db"的服务。这导致Django无法找到正确的数据库主机。

解决方法:在Docker Compose文件中添加一个名为"db"的服务,并将其与Postgres容器关联起来。可以使用以下代码将"db"服务添加到Docker Compose文件中:

db:

image: postgres:12

container_name: pos_db

volumes:

- postgres_data:/var/lib/postgresql/data

environment:

- POSTGRES_USER=postgres

- POSTGRES_PASSWORD=1234

- POSTGRES_DB=pos

ports:

- '5432:5432'

expose:

- 5432

networks:

- default

2. 网络配置错误:如果Django和Postgres容器不在同一个网络中,它们之间的连接也可能失败。

解决方法:确保Django容器和Postgres容器在同一个网络中。可以使用以下代码将它们都添加到名为"default"的网络中:

networks:

- default

通过将上述解决方法应用到问题中,可以解决Django连接到Postgres的问题。

0
0 Comments

Docker-compose是一种容器编排工具,可以通过编写docker-compose.yml文件来定义和运行多个容器。在使用Django连接到PostgreSQL数据库时,有时会遇到连接问题。下面是一种可能的原因和解决方法。

原因:

可能的原因是在docker-compose.yml文件中未正确定义数据库连接的环境变量。

解决方法:

1. 在docker-compose.yml文件中,确保正确设置了数据库连接的环境变量,包括DB_HOST、DB_NAME、DB_USER和DB_PASSWORD。这些环境变量将用于在Django的settings.py文件中配置数据库连接。

2. 在settings.py文件中,使用os.environ.get()方法获取环境变量的值,并将其分配给相应的数据库连接参数。确保在DATABASES字典中的default键下设置了正确的数据库连接参数,包括ENGINE、NAME、USER、PASSWORD、HOST和PORT。

下面是一个示例的docker-compose.yml文件和settings.py文件,可以根据实际情况进行修改:

docker-compose.yml文件内容:

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:

settings.py文件内容:

import os
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,
 }
}

通过正确配置docker-compose.yml文件和settings.py文件,可以解决Django通过docker-compose连接到PostgreSQL数据库的问题。

0
0 Comments

问题的出现的原因是:使用docker-compose创建的容器默认拥有自己的主机名和IP地址。当compose为您创建容器时,默认情况下,它还会将所有容器放在一个网络中,以便通过DNS进行发现。因此,在本地主机上无法通过localhost访问数据库,但可以通过服务名称"db"访问。

解决方法是:在settings.py中将'HOST'的值从'localhost'改为'db'。这样就可以通过服务名称来访问数据库。

如果使用主机网络,则上述问题和答案不适用。强烈建议避免使用主机网络,如果可能的话,可以考虑其他替代方案。

如果在操作系统上安装了postgres服务,并且希望在docker镜像中使用它,可以将'host'字段中的'localhost'替换为在docker中安装的postgres服务的IP地址。

另外,建议先将依赖项移到docker中,然后再使用docker网络。如果有其他问题,请使用"ask question"链接提出新问题或搜索与从容器内部访问主机服务相关的问题。

0