繁体   English   中英

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

[英]Password authentication failed for user in Docker postgres image

我试图将我的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"

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

场景1 - 使用单独的DB

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

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应用程序,它将连接。

进一步阅读postgres env变量

场景2 - 使用组合数据库

这里有很多解释,因为你必须设置一个等待DB完全初始化的entrypoint 但我已经逐步回答了关于如何在堆栈上执行此操作的问题

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

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 (有关如何设置它的说明,请参阅我之前提供的链接)。

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

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

使用上面的配置,您的Django配置将非常好。

从评论中编辑

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

$ ifconfig

在您的主机上将提供您的本地IP地址( 192.xxx10.xxx ),此IP是您在settings指定的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM