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

Fer*_*o M 9 docker oracle12c

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

docker commit Oracle_12 oracle/oradb:1
Run Code Online (Sandbox Code Playgroud)

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

docker run -d -it --name oradb_cont -p 1512:1521 -p 5500:5500 oracle/oradb:1
Run Code Online (Sandbox Code Playgroud)

此容器失败并出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

尽管消息“数据库已准备好使用”,但容器已“退出”。我们已将 bash 附加到容器以检查丢失文件的位置。结果似乎是“/diag”文件夹是一个损坏的符号链接:

在此处输入图片说明

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

yam*_*enk 3

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

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

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

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

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