docker создать том в существующий каталог скрывает существующие файлы в том же родительском каталоге - PullRequest
0 голосов
/ 30 января 2020

При использовании docker compose with presto sql image я столкнулся с определенной проблемой.

Если я настрою compose для монтирования тома в существующий каталог в образе, при запуске контейнера все файлы, которые существуют в том же рычаге, что и точка монтирования, исчезают. Все остальные файлы в родительском каталоге исчезают, остается только точка монтирования (с правильным содержимым тома внутри)

My docker -compose.yml выглядит следующим образом:

version: '2.2'
services:
  prestosql:
    image: prestosql/presto:329
    volumes:
       - ./src/test/resources/presto/catalog/:/usr/lib/presto/etc/catalog/

Если я exe c a bash в контейнер presto sql и ls the /usr/lib/presto/etc/ Я получаю:

[presto@7df706ccb1bc presto]$ ls -lah /usr/lib/presto/etc/
total 8.0K
drwxr-xr-x 3 root   root   4.0K Jan 30 15:12 .
drwxr-xr-x 1 presto presto 4.0K Jan 30 15:12 ..
drwxr-xr-x 4 presto presto  128 Jan 25 18:09 catalog

Однако, если я повторю процедуру без конфигурации тома и ls the /usr/lib/presto/etc/ Я получаю:

[presto@7b2c2178f6e9 /]$ ls -lah /usr/lib/presto/etc/
total 28K
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 .
drwxr-xr-x 3 presto presto 4.0K Jan 23 12:22 ..
drwxr-xr-x 2 presto presto 4.0K Jan 23 12:22 catalog
-rw-r--r-- 1 presto presto  178 Jan 23 12:22 config.properties
-rw-r--r-- 1 presto presto  295 Jan 23 12:22 jvm.config
-rw-r--r-- 1 presto presto   57 Jan 23 12:22 log.properties
-rw-r--r-- 1 presto presto   85 Jan 23 12:22 node.properties

Запуск проверки на контейнере показывает только объем на монтировках:

❯ docker inspect -f '{{ .Mounts }}' 7df706ccb1bc
[{bind  /blablabla/src/test/resources/presto/catalog /usr/lib/presto/etc/catalog  rw true rprivate}]

Это ожидаемое поведение?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Кажется, что изображение presto само по себе не содержит директорию /usr/lib/presto/etc/, но когда точка запуска контейнера (run-presto) создает символическую ссылку от /usr/lib/presto/default/etc до /usr/lib/presto/etc таким образом:

if [[ ! -d /usr/lib/presto/etc ]]; then
  if [[ -d /etc/presto ]]; then
    ln -s /etc/presto /usr/lib/presto/etc
  else
    ln -s /usr/lib/presto/default/etc /usr/lib/presto/etc
  fi 
fi

Таким образом, в общем случае, если вы смонтируете свой файл где-нибудь под /usr/lib/presto/etc, эта ссылка не будет создана, так что вы получите один файл в этой иерархии каталогов.

Решение довольно простое, просто вместо этого смонтируйте файл в /usr/lib/presto/default/etc:

...
volumes:
   - ./src/test/resources/presto/catalog/:/usr/lib/presto/default/etc/catalog/

Так же, как некоторые дополнительные примечания: На основе их документации:

Конфигурация, как ожидается, будет смонтирована в / etc / presto или / usr / lib / presto / et c (последний имеет приоритет). Если ни один из них не существует, то будет использоваться конфигурация по умолчанию с одним узлом.

Похоже, они ожидают, что вся конфигурация (т. Е. Все в et c) должна быть смонтирована целиком в / etc / presto или / usr / lib / presto / et c, поэтому они не ожидают добавления / замены одного файла, поэтому ваш подход не работает так, как вы хотели.

0 голосов
/ 30 января 2020

Является ли это ожидаемым поведением?

Возможно, оно не "ожидаемое" само по себе, но да, это поведение задуманно:

https://github.com/moby/moby/issues/4361

...