![](/img/trans.png)
[英]Docker Django Postgres FATAL: password authentication failed for user "postgres
[英]Password authentication failed for user in Docker postgres image
我试图将我的Django项目停靠。 为此,我试图将整个项目分为两部分
这是第一个容器的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应用程序,它将连接。
场景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.xxx
或10.xxx
),此IP是您在settings
指定的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.