Docker / Oracle 数据库 / 卷持久性 / 创建 Table space

Docker / Oracle Database / Volume Persistence / Create Table space

我正在构建一个 Dev Docker 环境,我必须设置一个 Oracle 19c 数据库。

我已经成功了...但还没有达到 100%。

一切都运行正确,我可以创建一个table空间,一个user/schema,创建一个table,插入数据,也通过NodeJs访问数据直到我重新启动容器。

在所有教程中,都显示挂载指向 /opt/oracle/oradata

的卷
volumes:
    - ./database/OracleDB/oradata:/opt/oracle/oradata

但是 table 空间默认创建在 /opt/oracle/product/19c/dbhome_1/dbs

我试图添加一个指向该目录的卷

volumes:
    - ./database/OracleDB/oradata:/opt/oracle/oradata
    - ./database/OracleDB/dbs:/opt/oracle/product/19c/dbhome_1/dbs/

但是我收到以下错误Error response from daemon: path /home/myusr/docker-base/database/OracleDB/dbs is mounted on / but it is not a shared mount.

有人遇到过这个问题并找到了解决方案吗?

我当然会继续寻找解决方案 ;)

系统信息

Windows 10 名 WSL2 专业人士

Docker 版本 20.10.8,内部版本 3967b7d

甲骨文数据库 19c

更新 1 基于罗伯托评论。不幸的是,它不起作用。

更新 2 我尝试了以下

CREATE TABLESPACE tbs1_test DATAFILE '/opt/oracle/oradata/tbs1_test' SIZE 100 M AUTOEXTEND ON NEXT 100 M MAXSIZE 10 G;

并在所需位置创建文件

当您不更改 db_create_file_dest 的值时,Oracle 将使用它作为数据文件的默认目标。在您的情况下,当您执行 create tablespace 命令时,数据文件是在默认位置创建的。这就是为什么它没有出现在您想要的目录中的原因。

1.Connect 作为数据库的 sysdba

2.Execute

SQL> alter system set db_create_file_dest = '/opt/oracle/oradata/ORCLCDB' scope=both;

3.As 您在上述目录中已有一个卷,删除其他卷规范,因为它已在 /

下共享

4.Remove 表空间并重新创建它(如果它是空的)

SQL> DROP TABLESPACE tbs1_test including contents and datafiles;
SQL> CREATE TABLESPACE tbs1_test DATAFILE 'tbs1_test' SIZE 100 M AUTOEXTEND ON NEXT 100 M MAXSIZE 10 G;

5.Verify 数据文件现在位于正确的卷中

SQL> select file_id, file_name from dba_data_files where tablespace_name = 'TBS1_TEST' ;

如果您想深入了解如何在 docker 图像中创建特定体积,请在 Whosebug 中查看此 post,恕我直言,它是最好的之一

How to mount host volumes into docker containers in Dockerfile during build