从容器符号链接创build的Docker Oracle12c企业镜像破碎

我们试图从一个基于Docker商店( https://store.docker.com/images/oracle-database-enterprise-edition )的Oracle 12c企业版镜像的容器中创build一个docker镜像。 我们有容器工作正常,然后,停止容器后,我们创build一个基于该容器的图像与下面的命令。

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 

尽pipe消息“数据库已准备好可用”,但容器仍处于“退出”状态。 我们已经附加了一个bash的容器来检查丢失的文件在哪里。 结果似乎是“/ diag”文件夹是一个破碎的符号链接:

在这里输入图像说明

启动原始Oracle 12c容器并附加一个bash,该文件夹存在。 看起来符号链接被破坏,或者文件不存在于只有从容器创build的映像中。

问题是/ORCL是一个数据量。 提交操作不包括卷内的任何文件。 您可以检查提交文档以获取更多信息。

因此,在启动新实例时,似乎日志文件正在被引用并且尚未创build。 您当前的容器处于不一致的状态,因为新实例中缺less提交的容器中存在的“/ ORCL”中的文件。

如果您在新机器上运行新实例,则需要将旧卷迁移到新机器中。 您可以通过运行docker inspect -f '{{ .Mounts }}' <old-container-name>来查找旧容器的容量,并按照如何将数据专用卷从一台主机移植到另一台主机中的指定进行迁移。

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

通常,作为最佳实践,不应该依赖commit命令来获取容器的相同实例。 而是构build一个扩展基础镜像的DockerFile,然后通过仅select必要的文件复制到新实例来添加自定义项。