我正试图按照本教程对Django+Postres项目进行Dockerize:https://docs.docker.com/samples/django/
当我运行docker-compose up
时,我得到:
django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
docker compose.yml
version: "3.9"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
depends_on:
- db
设置.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': 5432,
}
}
很可能您的Postgres容器没有启动和崩溃,因为您没有指定默认密码。根据文件-https://hub.docker.com/_/postgres,
PostgreSQL镜像使用了几个很容易遗漏的环境变量。唯一需要的变量是POSTGRES_PASSWORD,其余都是可选的。
要进行检查,请运行docker ps
并查看postgres容器是否正在运行,如果没有,请通过docker container logs [Container id]
检查日志
我建议您也应该添加其他变量,因为如果没有这些变量,您的Django应用程序将无法工作。您还需要添加POSTGRES_DB
和POSTGRES_USER
。
更新db
服务如下
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD:
POSTGRES_USER:
POSTGRES_DB:
确保它们与Django配置中的相同。
在这之后,您的方法中仍然存在一些问题。
在django中发送正确的配置。你已经在配置中设置了主机,你需要在那里添加正确的用户名和密码。
使用表初始化数据库,并在需要时填充数据。由于您使用的是卷,您可以简单地启动容器,在本地连接到数据库(记住添加端口映射-https://docs.docker.com/compose/compose-file/compose-file-v3/#ports)并在本地执行SQL命令。然后杀死容器并重新启动它们。然而,还有更好的方法。这是一个解决您问题的问题——Docker初始化SQL Server中的数据库表和记录。这是一个流行的问题,根据你的用例,在谷歌上搜索这个特定的问题可以找到更多的答案。