Образ Docker Oracle12c Enterprise создан из поврежденной символьной ссылки контейнера

Мы пытаемся создать образ докера из контейнера на основе образа Oracle 12c Enterprise Edition из магазина докеров ( https://store.docker.com/images/oracle-database-enterprise-edition). Контейнер работает нормально, а затем, после его остановки, мы создаем изображение на основе этого контейнера с помощью следующей команды.

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" является неработающей символической ссылкой:

Запуская оригинальный контейнер Oracle 12c и прикрепляя bash, папка присутствует. Кажется, символическая ссылка не работает или файл отсутствует только в изображении, созданном из контейнера.

1 ответ

Решение

Проблема в том, что /ORCL это объем данных. Операция фиксации не включает файлы, которые находятся внутри томов. Вы можете проверить документацию о коммите для получения дополнительной информации.

Таким образом, при запуске нового экземпляра создается впечатление, что каким-то образом на файл журнала ссылаются, и он еще не был создан. Ваш текущий контейнер находится в несовместимом состоянии, так как файлы в /ORCL, которые присутствовали в подтвержденном контейнере, отсутствуют в новом экземпляре.

Если вы запускаете новый экземпляр на новом компьютере, вам необходимо перенести старый том на новый компьютер. Вы можете найти объем старого контейнера, запустив docker inspect -f '{{ .Mounts }}' <old-container-name> и выполнить миграцию, как указано в разделе Как перенести тома только для данных с одного хоста на другой?

Если вы запускаете новый экземпляр на том же компьютере, просто смонтируйте старый том, используя: <volume-name-or-id>:/ORCL

В общем случае, не рекомендуется полагаться на команду commit для получения идентичных экземпляров контейнера. Скорее создайте DockerFile, который расширяет базовый образ, а затем добавьте настройки, выбрав только необходимые файлы для копирования на новом экземпляре.

Другие вопросы по тегам