-
时间:2023-02-08
-
标记:docker oracle 权限 volume
前言
首先,这篇文章是基于 helowin的镜像 完成的,本文的操作对该镜像做了以下优化:
-
容器内的环境变量启动时自动加载
-
解决卷持久化的权限问题
-
容器可重建
基础镜像是这个: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
容器内的环境变量启动时自动加载
原博客里没有将这些变量重新打包,这里只好自己动手了,首先按原博客做法,在 /etc/profile 中添加好 export,以及创建对应的文件链接。之后,切换到 oracle 用户,在 ~/.bashrc 文件的末尾添加:
source /etc/profile
强制oracle用户打开终端时再次加载你配的东西。
然后,把该容器打成镜像,以便后来者使用,我本来想上传的,碍于公司制度,暂时搁置,此处我的容器名叫 ooo
docker commit ooo oracle-fixed:0.2
卷持久化的权限问题
主要是 --privileged ,其他做法比较麻烦我就没研究了,compose文件里对应加上
容器可重建
由于容器本身就属于可重建资源,比如 docker-compose 管理下,一点点变动都会重建。
看基于该镜像的博客基本都做成了不可销毁的状态(指销毁了就无法重建后装载相关数据,或许可以但我没研究出来)。重建之后,之前改的管理员密码,创建的表空间什么的全都无了,表空间都无了,你持久化的那些表也都查不。还好没通知客户迁入,不然哪天有人重建了容器我就要被打死了……
作为一个容器却不可以被重建,既限制了容器的一个特性,又有别于大家的常识,这肯定不行的。这好比你用 double 类型声明了一个变量,却在注释里写了这个变量绝对不可以有小数否则有严重后果,那就这加重开发中的心智负担了。
回归正题,我思索它系统信息应该是放到oradata下的,拷贝并挂载后发现这种报错:
在 sqlplus 中,查看日志位置 show parameter background_dump_dest,查看该日志末尾信息如下:
可以推测,这是flash_recovery_area和oradata中某些控制文件的内容对不上,因此都挂载出来应该就没问题了。
初始化操作
docker run -it -d -p 1522:1521 --name ooo registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
先创建一个能启动的容器,从中拷贝出上述两个文件夹
docker cp ooo:/home/oracle/app/oracle/flash_recovery_area ./
docker cp ooo:/home/oracle/app/oracle/oradata ./
我这边已经在挂载目录了,因此如此拷贝。
挂载对应文件夹
这边使用 docker-compose 管理,对应文件配置如下:
version: "3.9"
services:
oracle:
image: oracle-fixed:0.2
ports:
- 1521:1521
container_name: oracle
privileged: true
volumes:
- '/apps/volume/oracle/data:/data/oracle'
- '/apps/volume/oracle/oradata:/home/oracle/app/oracle/oradata'
- '/apps/volume/oracle/flash_recovery_area:/home/oracle/app/oracle/flash_recovery_area'
但挂载后依然报上述错误,我检查过文件大小什么的,应该不存在启动容器时覆写这两个文件夹。所以,我推测可能是报错太模糊,实际上应该是没有权限读取,站在报错信息角度,读不到的数据确实可能以无法核对的形式报错。
权限问题
由于已经加了 --privileged ,所以我寻思不是挂载本身的问题。上述两个文件夹由于是挂载到容器的,因此它的权限很可能是 root:root,而 oracle 用户一般是访问 oracle:oinstall,到容器里一看,果然如此。但这个镜像用的是 oracle 用户进行处理,启动时没权限去更改这两个文件夹的所有者,因此在compose文件中改比较困难。我仔细观察了下,发现这个容器自己创建的文件夹的所有者是 500,我找不到这个神秘用户是什么,各位哪个知道请告诉我下谢谢(/etc/passwd 找不到)。于是我讲这两个文件夹都改成了这个用户为所有者。
chown -R 500 /home/oracle/app/oracle/flash_recovery_area /home/oracle/app/oracle/oradata
再次运行 docker-compose up -d ,没有报错,database 也正确挂载,可以正常登录,创表空间、用户、表、插入数据,移除容器,再启动,查询,有数据,OK了。
声明
需要声明的是,我对原作者没有恶意,也感谢他做的镜像,只是要达到我的需求还要再进一步,分享出来供大家参考下。