Образ 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, который расширяет базовый образ, а затем добавьте настройки, выбрав только необходимые файлы для копирования на новом экземпляре.