Docker环境下Django容器无法连接Oracle 19数据库问题求助
问题排查与解决
核心问题:容器网络地址解析错误
你在.env里配置的DATABASE_HOST=localhost和DATABASE_DSN=localhost/ORCLCDB是错误的。在Docker Compose的默认网络环境中,每个容器都是独立的网络节点,容器内的localhost指向容器自身,而非宿主机或Oracle数据库容器。
具体解决步骤
1. 修正环境变量中的数据库地址
更新.env文件,将数据库地址替换为Docker Compose服务名称:
SECRET_KEY=<my_secret_key> DEBUG=True DATABASE_ENGINE=django.db.backends.oracle DATABASE_NAME=ORCLCDB DATABASE_USER=c##vaccart DATABASE_PASSWORD=<my_password> # 替换为数据库服务名称 DATABASE_HOST=oracle-database DATABASE_PORT=1521 # 替换为数据库服务名称+数据库名 DATABASE_DSN=oracle-database/ORCLCDB
Docker Compose会自动将服务名称oracle-database解析为对应容器的IP地址,容器间可直接通过服务名通信。
2. 规范Django数据库配置逻辑
你的settings.py手动创建数据库连接的方式不符合Django规范,且会在初始化阶段过早尝试连接数据库。修改为Django标准的DATABASES配置:
import environ import oracledb import sys sys.modules["cx_Oracle"] = oracledb # 初始化环境变量 env = environ.Env() environ.Env.read_env() # 配置Django数据库连接(替换原手动连接代码) DATABASES = { 'default': { 'ENGINE': env('DATABASE_ENGINE'), 'NAME': env('DATABASE_NAME'), 'USER': env('DATABASE_USER'), 'PASSWORD': env('DATABASE_PASSWORD'), 'HOST': env('DATABASE_HOST'), 'PORT': env('DATABASE_PORT'), } }
3. 处理数据库启动延迟问题
depends_on仅保证容器启动顺序,不保证Oracle数据库服务完全就绪(Oracle 19c启动初始化需要较长时间)。可添加等待脚本确保数据库就绪后再启动Django:
步骤1:添加等待脚本
在项目根目录创建wait-for-it.sh,并赋予执行权限:chmod +x wait-for-it.sh
#!/usr/bin/env bash set -e host="$1" shift port="$1" shift cmd="$@" # 循环等待数据库端口开放 until nc -z "$host" "$port"; do >&2 echo "数据库未就绪 - 等待5秒重试" sleep 5 done >&2 echo "数据库已就绪 - 启动Django" exec $cmd
步骤2:修改Dockerfile的启动命令
FROM python:3 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /app # 安装netcat用于端口检测 RUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/* COPY requirements.txt /app RUN pip install -r requirements.txt COPY . . # 使用等待脚本启动Django CMD ["./wait-for-it.sh", "oracle-database", "1521", "--", "python", "manage.py", "runserver", "0.0.0.0:8000"]
4. 验证容器网络连通性
若修改后仍有问题,进入Django容器测试网络连通性:
# 测试能否ping通数据库容器 docker-compose exec django-back-end ping oracle-database # 测试数据库端口是否开放 docker-compose exec django-back-end nc -zv oracle-database 1521
如果无法连通,检查Docker Compose默认网络是否正常(同一compose文件的服务默认在同一网络,无需额外配置)。
额外检查项
- 查看Oracle容器启动日志,确认数据库初始化完成:
docker-compose logs oracle-database,日志中应出现类似"DATABASE IS READY TO USE!"的提示。 - 确认
c##vaccart用户已正确创建,且拥有访问ORCLCDB数据库的权限。
内容的提问来源于stack exchange,提问作者Vianney
相关产品推荐
相关产品推荐

