Как исправить отказ в разрешении доступа к каталогу, если этот каталог был добавлен во время сборки Docker? - PullRequest
0 голосов
/ 31 августа 2018

Я использовал следующие Dockerfile для расширения образа докера:

FROM solr:6.6

COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/

Обратите внимание, что solr:6.6 имеет оператор USER solr.

При запуске контейнера, созданного из этого Dockerfile, я получаю отказ в разрешении при попытке доступа к файлу или каталогу в /A12Core:

$ docker run -it 2f3c58f093e6 /bin/bash
solr@c091f0cd9127:/opt/solr$ cd /A12Core
solr@c091f0cd9127:/A12Core$ cd conf
bash: cd: conf: Permission denied
solr@c091f0cd9127:/A12Core$ ls -l
total 8
drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf
-rw-r--r-- 1 solr solr  158 Jun 28 14:25 core.properties
solr@c091f0cd9127:/A12Core$ whoami
solr
solr@c091f0cd9127:/A12Core$

Что мне нужно сделать, чтобы получить разрешение на доступ к полям и папкам в каталоге /A12Core?

Обратите внимание, что я запускаю сборку докера из Windows 7. Моя версия докера 18.03.0-ce.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Ваш каталог не имеет разрешения на выполнение:

drw-r--r-- 3 solr solr 4096 Aug 31 14:21 conf

Без этого вы не можете перейти в каталог в соответствии с разрешениями файловой системы Linux. Вы можете исправить это на вашем хосте с помощью chmod:

chmod +x conf

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

0 голосов
/ 31 августа 2018

У меня был другой ответ, который был неправильным (но все же решил вашу проблему :), но теперь я вижу опечатку в вашем Dockerfile. Давайте посмотрим на эту строку.

COPY --chown=solr:solr ./services-core/search/A12Core /A12Core/

Команда COPY проверяет, существует ли целевой путь в контейнере. Если нет, он создает его перед копированием.

  1. Требуется A12Core от ./services-core/search.
  2. Затем проверяется, существует ли путь /A12Core.
  3. Очевидно, что нет. Итак, команда создает его с правами доступа root:root.
  4. Наконец, он копирует содержимое A12Core во вновь созданный A12Core.

В конце концов, у вас есть все в /A12Core, но оно принадлежит root, и вы не можете получить к нему доступ.

Поскольку solr образ докера уже устанавливает USER solr, путь будет

RUN mkdir /A12Core
COPY ./services-core/search/A12Core /A12Core

Как документы говорят

Инструкция USER устанавливает имя пользователя ... группу пользователей ... для любых инструкций RUN, CMD и ENTRYPOINT, которые следуют за ней в Dockerfile.

...