Docker postgres映像中的用户密码验证失败

时间:2018-05-14 20:32:48

标签: django database postgresql docker web

我正在尝试将我的Django项目停靠。为此,我试图将整个项目分为两部分

  • 整个网络相关的东西在一个容器中。
  • 数据库,即另一个
  • 中的Postgres

这是第一个容器的Dockerfile。

FROM alpine

# Initialize
RUN mkdir -p /data/web
WORKDIR /data/web
COPY /requirements/* /data/web/

# Setup
RUN apk update
RUN apk upgrade
RUN apk add --update python3 python3-dev postgresql-client postgresql-dev build-base gettext
RUN apk add libffi-dev zlib-dev
RUN apk add build-base python-dev py-pip jpeg-dev
ENV LIBRARY_PATH=/lib:/usr/lib

RUN pip3 install --upgrade pip

RUN pip3 install -r production.txt

RUN pip3 install gunicorn

# Clean
RUN apk del -r python3-dev postgresql

# Prepare
COPY . /data/web/
RUN mkdir -p mydjango/static/admin

RUN chmod u+x docker-entrypoint.sh

# Copy entrypoint script into the image
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

我使用命令

创建了一个postgres数据库实例
docker run --name postgres -it -e POSTGRES_USER=mannu -e POSTGRES_PASSWORD=mysecretpassword postgres

当这个postgres实例开始运行时,我输入了shell postgres实例usint

docker exec -it postgres /bin/bash
root@ae052fbce400:/# psql -U psql

在打开的Psql shell中,我创建了名为db_name的数据库,并授予postgreuser名为mannu的所有权限;

完成上述所有步骤后,我已经配置了我的setting.py文件: -

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'itoucan',
        'USER': 'mannu',
        'PASSWORD': 'mysecretpassword',
        'HOST': 'postgres',
        'PORT': 5432
    }
}

这是我的docker-compose.yml文件

版本:' 3'

services:
    web:
        image: 1ce04167758d  #image build of above Dockerfile config
        command: python manage.py runserver
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - postgres
    postgres:
        image: postgres
        env_file:
            - .env
        expose:
            - "5432"

当我运行docker-compose up时,我收到以下错误: -

web_1       | django.db.utils.OperationalError: FATAL:  password authentication failed for user "mannu"

2 个答案:

答案 0 :(得分:4)

我尝试了各种步骤,但这是解决我的问题的步骤。

docker stop $(docker ps -qa)&& docker system prune -af --volumes

docker-compose up

答案 1 :(得分:3)

这是因为您创建了两个数据库服务。一个通过docker run手动,一个通过docker-compose。不幸的是,两者都无法使用,这意味着它们必须重新配置才能合作。

场景1 - 使用单独的数据库

您应该从撰写文件中删除数据库定义 - 因此它看起来像这样:

version: '3'

services:
    web:
        image: 1ce04167758d
        command: python manage.py runserver
        volumes:
            - .:/code
        ports:
            - "8000:8000"

在您的配置中,您应该将postgres更改为您的主机 - 例如192.168.1.2

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'itoucan',
        'USER': 'mannu',
        'PASSWORD': 'mysecretpassword',
        'HOST': '192.168.1.2',
        'PORT': 5432
    }
}

然后,通过run命令运行单独的数据库服务,但是公开公开端口。

docker run --name postgres -it -p 5432:5432 -e POSTGRES_USER=mannu -e POSTGRES_PASSWORD=mysecretpassword postgres

完成初始化后,当您完成添加数据库和用户时,您可以启动Django应用程序并进行连接。

further reading on postgres env variables

场景2 - 使用撰写数据库

这里有很多解释,因为你必须设置一个等待DB完全初始化的entrypoint。但我已经逐步回答了如何做到这一点here on stack

除了数据库服务之外,您的情况基本相同。你几乎像现在一样离开你的作品,稍微改变一下:

version: '3'

services:
    web:
        image: 1ce04167758d
        command: python manage.py runserver
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - postgres
        entrypoint: ["./docker-entrypoint.sh"]

    postgres:
        image: postgres
        env_file:
            - .env

我添加了entrypoint,它应该等到你的数据库服务完成初始化(有关如何设置它的说明,你应该参考我之前提供的链接)。

我可以看到您已经定义了一个入口点 - 我建议从entrypoint删除此Dockerfile,将其移至compose文件并将其合并我在推荐链接中所描述的内容。这是商业/大型环境中的常见做法,因为您可能会有很多entrypoint,或者/和entrypoint可能无法在构建时运行 - 就像我建议的那样。

我已经删除了数据库端口映射,因为如果不需要,您不应该公开服务 - 如果只有web服务应该使用数据库,那么我们就不应该&# 39;暴露数据库以获得其他可能性。

使用上面的配置,你的Django配置会非常好。

从评论中修改

为postgres提供的0.0.0.0 IP声明服务器将侦听所有传入连接。这意味着在settings.py中您应该指定 0.0.0.0地址,而是指定运行服务的主机的地址 - 在您的情况下,我猜它会运行在您的计算机上 - 所以只需运行:

$ ifconfig
主机上的

将提供您的本地IP地址(192.x.x.x10.x.x.x),此IP是您在settings中指定的