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

时间:2019-01-03 08:53:47

标签: 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-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?

3 个答案:

答案 0 :(得分:1)

我认为问题是您的postresql在django ap尝试连接时尚未准备就绪。 Docker compose始终以依赖关系顺序或文件中的顺序顺序(如果未给出)启动和停止容器。但是docker-compose不能保证它会一直等到依赖容器运行之后。您可以从here引用它。如果将应用程序连接到数据库时数据库已准备就绪,则您的应用程序有时可能会工作。

  

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

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

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

答案 1 :(得分:0)

您尚未在port文件中配置docker-compose

ports:
    - "5432:5432"

答案 2 :(得分:0)

只需添加ports

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"