我正在尝试将我的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"
答案 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.x
或10.x.x.x
),此IP是您在settings
中指定的