从容器符号链接创建的Docker Oracle12c Enterprise映像已损坏

时间:2017-11-15 10:46:30

标签: docker oracle12c

我们正在尝试根据来自docker store(https://store.docker.com/images/oracle-database-enterprise-edition)的Oracle 12c Enterprise Edition映像从容器创建docker镜像。我们让容器工作正常,然后在停止容器之后,我们使用以下命令基于该容器创建一个图像。

docker commit Oracle_12 oracle/oradb:1

然后,我们尝试使用提交的图像使用以下命令运行容器:

docker run -d -it --name oradb_cont -p 1512:1521 -p 5500:5500 oracle/oradb:1

此容器因以下错误而失败:

Start up Oracle Database
Wed Nov 15 10:31:29 UTC 2017
start database
start listener
The database is ready for use .
tail: cannot open '/u01/app/oracle/diag/rdbms/orclcdb/ORCLCDB/trace/alert_ORCLCDB.log' for reading: No such file or directory
tail: no files remaining

容器已经退出"虽然消息"数据库已准备好使用"。 我们在容器上附加了一个bash来检查丢失文件的位置。而结果似乎是" / diag"文件夹是一个破损的符号链接:

enter image description here

启动原始Oracle 12c容器并附加bash,该文件夹存在。似乎符号链接已断开或文件不仅存在于从容器创建的图像中。

1 个答案:

答案 0 :(得分:0)

问题是/ORCL是一个数据卷。提交操作不包括卷内的任何文件。您可以查看commit documentation了解详情。

因此,在启动新实例时,似乎某个日志文件被引用并且尚未创建。您当前的容器处于不一致状态,因为' / ORCL'下的文件新实例中缺少提交容器中存在的内容。

如果要在新计算机上运行新实例,则需要将旧卷迁移到新计算机中。您可以通过运行docker inspect -f '{{ .Mounts }}' <old-container-name>找到旧容器的容量,并按How to port data-only volumes from one host to another?

中的指定进行迁移

如果您在同一台计算机上运行新实例,只需使用以下命令安装旧卷:<volume-name-or-id>:/ORCL

通常,作为最佳实践,您不应该依赖commit命令来获取容器的相同实例。而是构建一个扩展基本映像的DockerFile,然后通过仅选择要在新实例上复制的必要文件来添加自定义。