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
无法连接到服务器:拒绝使用docker从django连接postresql_Django_Docker - Fatal编程技术网

无法连接到服务器:拒绝使用docker从django连接postresql

无法连接到服务器:拒绝使用docker从django连接postresql,django,docker,Django,Docker,我正在使用Django 2.x并使用Docker配置它 我正在使用postresql数据库引擎 Dockerfile内容为 FROM python:3-alpine RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc curl RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-

我正在使用
Django 2.x
并使用
Docker
配置它

我正在使用
postresql
数据库引擎

Dockerfile内容为

FROM python:3-alpine
RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc curl
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev postgresql-dev
RUN apk add --no-cache bash
ENV PYTHONUNBUFFERED 1
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
RUN set -ex && mkdir /app
COPY Pipfile /app
COPY Pipfile.lock /app
WORKDIR /app
RUN pip install pipenv
RUN pipenv install --system --deploy
ADD . /app/
RUN chmod +x start.sh

# Expose port
EXPOSE 9010
docker compose.yml文件包含

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: "originor-nginx"
    ports:
      - "10080:80"
      - "10443:43"
    volumes:
      - .:/app
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - web
    networks:
      - originor_web_network
  web:
    build: .
    container_name: "originor-web"
    command: ./start.sh
    volumes:
      - .:/app
    ports:
      - "9010:9010"
    depends_on:
      - db
    networks:
      - originor_web_network
      - originor_db_network
  db:
    image: postgres:11
    container_name: "originor-postgres-schema"
    volumes:
      - originor_database:/var/lib/postgresql/data
    networks:
      - originor_db_network
    environment:
      - POSTGRES_USER=originor_schema_u
      - POSTGRES_PASSWORD=ADF45sa98SD9q9we8r34&
      - POSTGRES_DB=originor_schema

networks:
  originor_web_network:
    driver: bridge
  originor_db_network:
    driver: bridge

volumes:
  originor_database:
并且Django settings.py文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'originor_schema',
        'USER': 'originor_schema_u',
        'PASSWORD': 'ADF45sa98SD9q9we8r34&',
        'HOST': 'db',
        'PORT': '5432',
    }
}
但是当我跑的时候

docker-compose up
它给出的错误为

originor-web | django.db.utils.OperationalError: could not connect to server: Connection refused
originor-web |  Is the server running on host "db" (172.23.0.2) and accepting
originor-web |  TCP/IP connections on port 5432?

您尚未在
docker compose
文件中配置
端口

ports:
    - "5432:5432"

只需添加
端口

db:
    image: postgres:11
    container_name: "originor-postgres-schema"
    volumes:
      - originor_database:/var/lib/postgresql/data
    networks:
      - originor_db_network
    environment:
      - POSTGRES_USER=originor_schema_u
      - POSTGRES_PASSWORD=ADF45sa98SD9q9we8r34&
      - POSTGRES_DB=originor_schema
    ports:
      - "15432:5432"

我认为问题在于,当django ap试图连接到它时,您的
postresql
没有准备好。Docker compose始终按照依赖顺序启动和停止容器,如果没有给定,则按照文件中的顺序启动和停止容器。但是docker compose不保证它将等待依赖项容器运行。你可以从我的网站上查到。当应用程序连接到数据库时,如果数据库已准备就绪,则有时应用程序可能会工作

但是,对于启动,Compose不会等到容器“就绪”(无论对您的特定应用程序意味着什么)时才开始,而是等到它运行时才开始。这是有充分理由的

因此,为了克服这些不一致性,您可以使用或类似的脚本来包装django应用程序启动命令。将上述脚本复制到项目根目录后,可以将web容器的命令更改为以下命令:

command: ["./wait-for-it.sh", "db:5432", "--", "./start.sh"]

您不需要映射端口,因为服务位于同一网络
originor\u db\u网络
当我添加端口时,它第一次工作,但再次运行会再次出现相同的错误。再次运行是什么意思?如果它是第一次工作,其余的应该可以。@PPShein再次运行意味着在从头删除所有内容后重建项目。@PPShein您不需要公开端口就可以从同一网络访问它。看到这个答案(postgres官方Dockerfile已经公开了这个端口)。关于曝光和发布的不同,请参见下面的答案,我感觉相同。因为第一次出现这个错误。但下次我重新运行docker compose up时,它会工作,数据库也会连接。有时它也是第一次工作,有时不工作。是的,您的撰写文件所有其他配置都很好。您不需要映射任何端口来使用同一网络中的服务,所以请尝试在命令中使用wait-for-it.sh包装脚本来克服此类应用程序统计不一致的问题。