You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:50:54