惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cybersecurity and Infrastructure Security Agency CISA
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
小众软件
小众软件
博客园 - 【当耐特】
爱范儿
爱范儿
美团技术团队
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
月光博客
月光博客
宝玉的分享
宝玉的分享
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
Spread Privacy
Spread Privacy
博客园 - 叶小钗
量子位
Security Archives - TechRepublic
Security Archives - TechRepublic
Google DeepMind News
Google DeepMind News
L
LINUX DO - 热门话题
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Privacy International News Feed
Y
Y Combinator Blog
P
Proofpoint News Feed
NISL@THU
NISL@THU
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
G
Google Developers Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
I
InfoQ
Cisco Talos Blog
Cisco Talos Blog
Google Online Security Blog
Google Online Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Vulnerabilities – Threatpost
B
Blog
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
N
News | PayPal Newsroom
J
Java Code Geeks
Latest news
Latest news
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - AlfredZhao

impdp 遇到 TSTZ Version 报错:ORA-39405 处理实践 数据乱成一锅粥,还能先做本体吗? SQL*Plus 执行中文 SQL 文件,如何避开乱码坑 Podman 报错:普通用户无法运行 rootless Podman 怎么办 语义层构建:企业级AI落地绕不开的关键 AI时代最扎心的真相:人类在打杂,AI在做决策 Win7老系统登录报错怎么解?PuTTY这次真能救急 Linux 主机防火墙如何同时开启 80 和 443? AI 编程变更记录:知识加工模块与博客工厂模块的状态重新定义 一篇搞定:用 curl 测试私有部署模型联通性 DBA除了修库,还能把经验变成更大的价值 原本3GB+ 的 Docker 镜像直接缩成500M RAG技术从1.0到4.0,系统为何越来越“会想” 生产环境里,为什么不建议把普通端口直接暴露到公网? ORACLE默默地搞了个免费的智能体工厂 GPT 省钱,不是别用最新模型,而是别浪费缓存 Docker 容器时区不对,`timedatectl` 不存在怎么办? AI 编程工作总结:从体验问题到模块能力建设 OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G? vi 删除指定范围的行,不用再反复按 dd AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板 氛围编程实战系列:先规划清楚学习路径 入门:我的第一个Vibe Coding实践程序 Linux时区修改为CST 如何在Oracle Agent Factory中配置国内厂商的LLM? Oracle Deep Data Security (Deep Sec) 初体验 Codex 和 OpenClaw,到底差在哪? 微信对接OpenClaw的常见问题和解决方案 在群晖NAS上配置OpenClaw:一次踩坑后的保姆级教程(完整修订版) 用Docker安全驯服OpenClaw,并打通社交软件 RAG 时代的“破壁人”:为什么你的大模型应用急需 Docling? 为什么 AI 服务器首选 Ubuntu?难道 OEL 和 RHEL 不香吗? APEX实战第12篇:Oracle APEX 工作区密码忘记了怎么办? AI开发者如何无痛部署Oracle AI Database 26ai环境 Oracle 26ai 本地通用版这次是真的来了 Docker 快速入门:手把手教你打包 Python 应用 APEX实战第11篇:图形界面轻松解锁工作区账户 APEX实战第10篇:手把手教你给APEX打补丁 APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全 小白学AI开发01:创建第一个示例Agent LangChain、LangFlow、LangGraph:一文讲清三大 LLM 框架的定位与差异 使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战指南) Oracle RAS:AI时代企业数据安全核心 新版MOS(My Oracle Support)主要变化 APEX实战第8篇:ORDS连库报错574?一招根治用户过期问题 为什么 Iceberg 在数据湖领域这么火
APEX实战第13篇:全套开发环境的本地配置与恢复实践
AlfredZhao · 2026-05-11 · via 博客园 - AlfredZhao

随着AI企业级应用类项目进入深水区,已经有越来越多的人都会切身体会到,在AI背后,有一个统一的,原生就能支持多模态数据的平台有多重要。再进一步,在这个多模态数据平台基础之上,如果能再配套一个原生的低代码开发平台,用于快速验证各种功能,会比100%的Vibe Coding更加可控,也更适合企业级场景。

往往听到这样复杂的一个数据平台和开发平台,单独搭建其中一个测试环境都会门槛极高,但实际上,今天我们可以在自己的笔记本电脑上,利用官方的docker镜像,就可以轻松构建出一整套环境(Oracle 26ai free + APEX + ORDS)。

注:因为这里用的free版,任何人都可以无门槛测试使用,如果你有无限制的EE版可用,当然更好。

01 | 本地APEX全套docker环境配置参考

几个月前笔者为了方便在无网环境下做演示,在笔记本电脑上构建了一个基于 Oracle 26ai free + APEX + ORDS 最小开发测试环境。不过后来因为实际工作都在客户环境或者云端验证,所以也就没怎么管笔记本这个环境。

但在近期测试一个迁移的项目中,需要用到多环境来验证一些功能性问题,就想到了这个最小测试环境。

之前笔者已经根据Oracle官方的一些文档说明,同时结合笔者的实际情况调试成功了一个配置文件docker-compose.yml:

内容如下(同样有测试需求的小伙伴可以直接参考这个配置,简单高效,但注意密码的地方 ORACLE_PWD 建议要改成自己的哈~ 另外 external 的那些外部卷提前手工建好,保留你自己的数据,防止以后重建导致数据丢失~)

% cat docker-compose.yml 
name: oracle-apex-dev

services:
  # --- 数据库服务 ---
  oracle26ai:
    container_name: oracle26ai-free
    image: container-registry.oracle.com/database/free:23.26.1.0-arm64
    restart: always
    hostname: database  # 方便 ORDS 通过名字访问
    ports:
      - "1521:1521"
      - "5500:5500"
    networks:
      mynet:
        ipv4_address: 192.168.26.26
    volumes:
      - oradata:/opt/oracle/oradata
      - orafra:/opt/oracle/fast_recovery_area
      - /Users/alfredzhao/media:/u01/media
    environment:
      - TZ=Asia/Shanghai
      - ORACLE_PWD="Cs4321tFrGnY8cKudQbq"
      - ENABLE_ARCHIVELOG=true
      - ENABLE_FORCE_LOGGING=true
      - ORACLE_CHARACTERSET=AL32UTF8
      - INIT_SGA_SIZE=2048
      - INIT_PGA_SIZE=1024
    healthcheck:
      test: ["CMD-SHELL", "lsnrctl status | grep -q 'READY' || exit 1"]
      interval: 20s
      timeout: 10s
      retries: 30

  # --- ORDS 服务 ---
  ords:
    container_name: ords
    image: container-registry.oracle.com/database/ords:25.4.0
    restart: on-failure
    ports:
      - "8080:8080"
    networks:
      mynet:
        ipv4_address: 192.168.26.80
    environment:
      - DBHOST=database
      - DBPORT=1521
      - DBSERVICENAME=FREEPDB1
      - ORACLE_PWD="Cs4321tFrGnY8cKudQbq"
      - JDK_JAVA_OPTIONS=-Xms512M -Xmx1024M
    volumes:
      - ords_config:/etc/ords/config
      # 指向你解压后的真实 apex 目录(包含 images 的那一层)
      - /Users/alfredzhao/media/apex-latest/apex:/opt/oracle/apex
    depends_on:
      oracle26ai:
        condition: service_healthy

# --- 网络定义 ---
networks:
  mynet:
    external: true

# --- 数据卷定义 ---
volumes:
  oradata:
    external: true
  orafra:
    external: true
  ords_config:
    # ORDS 的配置建议持久化,防止重新 Up 后需要再次初始化
    name: ords_config

可以看到这个配置中,已经充分考虑到了数据持久化的设计,在数据卷的配置使用中,除了定义的之外,还额外用到一个本地的目录做绑定挂载,方便做一些双向操作。

02 | 快速恢复全套docker环境

有这样的环境,不但方便,还不怕损坏,因为坏了受影响的只是自己。

另外,即便极限测试给搞坏了也可以快速恢复。

比如,上面提到的那个本地的目录做绑定挂载,也就是 /Users/alfredzhao/media 这个目录。

之前初始化环境时顺手放到Download中,但笔者的笔记本空间实在有限,经常需要清理Download文件夹,为了防止误操作,笔者就把这些需要长久用到的目录做了迁移,迁移完之后笔者就直接修改更新了这个路径在yml配置文件中。

但是,在调用笔者之前写好的重启命令时,发现APEX对图片资源访问不到。

进一步排查发现是容器内的配置并没有更新,发现重启docker并未自动重建容器,从docker ps输出的 CREATED 和 STATUS可以印证这一点,创建时间还是在2个月前:

% docker ps
CONTAINER ID   IMAGE                                                         COMMAND                   CREATED        STATUS                            PORTS                                                                                      NAMES
d4ff05642719   container-registry.oracle.com/database/ords:25.4.0            "docker-entrypoint.sh"    2 months ago   Up 2 minutes                      0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp                                                ords
cb92789566da   container-registry.oracle.com/database/free:23.26.1.0-arm64   "/bin/bash -c $ORACL…"   2 months ago   Up 2 minutes (healthy)            0.0.0.0:1521->1521/tcp, [::]:1521->1521/tcp, 0.0.0.0:5500->5500/tcp, [::]:5500->5500/tcp   oracle26ai-free

另外因为笔者这里docker原生环境受限,借用了colima环境,colima启动会自动拉起docker,但前面已经发现自动拉起的docker并没有正确读取到更新的yml文件。

所以处理思路只能是在启动colima环境之后,再手工执行下重建。

检查语法并预览最终配置(这里确认笔者之前改的路径在这里已经变了没有问题)

docker-compose config

应用并重建(这条命令会重建应用,放心,因为笔者这里已经将所有需要持久化保存的内容都存储在外部卷或外部目录中,重建不会丢失任何历史数据)

docker-compose up -d

再次检查,发现CREATED字段的时间已更新,是刚刚创建好的:

% docker ps
CONTAINER ID   IMAGE                                                         COMMAND                   CREATED          STATUS                    PORTS                                                                                      NAMES
af956b9d5694   container-registry.oracle.com/database/ords:25.4.0            "docker-entrypoint.sh"    25 seconds ago   Up 9 seconds              0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp                                                ords
9dc0e57ceda6   container-registry.oracle.com/database/free:23.26.1.0-arm64   "/bin/bash -c $ORACL…"   27 seconds ago   Up 14 seconds (healthy)   0.0.0.0:1521->1521/tcp, [::]:1521->1521/tcp, 0.0.0.0:5500->5500/tcp, [::]:5500->5500/tcp   oracle26ai-free

再次登录本机的测试环境,一切恢复正常:

所以,有这样一个本地的全套开发环境,非常方便做各种极限功能验证,而且完全不怕损坏,自由度也就非常高。