Объем Docker создает сбой в поведении контейнера

#docker #docker-compose #confluence #docker-volume

#docker #docker-compose #слияние #docker-volume

Вопрос:

я пытаюсь создать том каталога в контейнере docker (confluence). https://hub.docker.com/r/atlassian/confluence-server /

Чтобы исправить ошибку с postgres, я должен вручную добавить файлы драйверов в контейнер. Местоположение внутри контейнера:

 /opt/atlassian/confluence/confluence/WEB-INF/lib
 

После создания тома я хотел добавить в каталог более новый драйвер. Итак, внутри моего docker-compose.yaml я сопоставил том с каталогом.

 - ./data/driverfiles:/opt/atlassian/confluence/confluence/WEB-INF/lib
 

Том и каталог создаются после вызова docker-compose up , и все кажется нормальным.

Проблема в том, что том остается пустым, и при запуске интерактивной оболочки в контейнер каталог, который когда-то заполнялся тысячами файлов, тоже пуст. При удалении тома из docker-compose.yaml каталог снова заполняется файлами.

Объективно, похоже, что сопоставление тома с этим каталогом каким-то образом запрещает контейнеру обогащать его файлами, что здесь происходит?

Ответ №1:

Если вы монтируете каталог хоста поверх каталога контейнера, во время запуска контейнера это всегда односторонняя операция: все, что находится в каталоге хоста (если что-либо), полностью заменяет все, что могло быть в образе. Содержимое контейнера никогда не будет скопировано в каталог хоста, если код запуска образа явно не сделает это за вас.

Если вам нужно изменить файл конфигурации в контейнере, вам необходимо сначала скопировать его из образа; например

 # with the volumes: mount deleted
docker-compose run confluence 
  sh -c 'cd /opt/atlassian/confluence/confluence/WEB-INF/lib amp;amp; tar cf - .' 
| tar xf - .
 

Этот конкретный вызов скопирует весь каталог на хост, где вы сможете смонтировать его снова.

Обратите внимание, что если есть обновленный образ, который изменяет содержимое этого lib каталога, содержимое, которое у вас есть на хосте, всегда будет иметь приоритет; это скрывает любые изменения, которые могут быть внесены в образ.

Возможно, вам будет надежнее создать пользовательский образ, который добавляет необходимые файлы драйверов

 FROM ...conflunce:...
COPY ... /opt/atlassian/confluence/confluence/WEB-INF/lib
# Use CMD and all other options from the original image
 

Укажите build: . (и нет image: ) в docker-compose.yml файле, чтобы использовать этот Dockerfile.