Почему сборка Docker не выполняется в Docker в Docker Jenkins Build: '/proc/1/map_files': операция не разрешена
Приведенная ниже инструкция правильно встроена в MacOS Docker Engine 18.04, в то время как эта же инструкция не выполняется при сборке в контейнере Jenkins, работающем с Docker (Docker-in-Docker, dind, Inception)... Почему причина ошибки и какой обходной путь?
сборка локального докера на MacOS
Step 12/16 : RUN find / -name "spring-cloud-config-server*.jar"
! -name "*sources*" -exec cp -t /tmp {} + &&
mkdir /runtime &&
mv /tmp/spring-cloud-config*.jar /runtime/config-service.jar &&
rm -f /*.jar
---> Using cache
Докер-ин-Докер Дженкинс Билд
Step 12/16 : RUN find / -name "spring-cloud-config-server*.jar"
! -name "*sources*" -exec cp -t /tmp {} + &&
mkdir /runtime &&
mv /tmp/spring-cloud-config*.jar /runtime/config-service.jar &&
rm -f /*.jar
---> Running in f64908a07aa1
find: ‘/proc/1/map_files’: Operation not permitted
find: ‘/proc/7/map_files’: Operation not permitted
The command '/bin/sh -c find / -name "spring-cloud-config-server*.jar"
! -name "*sources*" -exec cp -t /tmp {} + && mkdir /runtime &&
mv /tmp/spring-cloud-config*.jar /runtime/config-service.jar &&
rm -f /*.jar' returned a non-zero code: 1
script returned exit code 1
1 ответ
Решение
- Избегайте использования глобального поиска
find /
так как это включает в себя другие каталоги- Эти дополнительные каталоги могут иметь разные разрешения rw для пользователя работающего докера в инструкциях по сборке докера,
Выше было решено с помощью следующего:
RUN mkdir /runtime && \
find /tmp -name "spring-cloud-config-server*.jar" ! -name "*sources*" -exec cp -t /runtime {} + && \
mv /runtime/spring-cloud-config*.jar /runtime/config-service.jar && \
rm -f /tmp/*.jar
объяснение
Ответ заключается в следующих концепциях:
- Контейнер Docker, работает в
dind
, добавляет процессы, которые разрешены только ОС хоста. - Во время выполнения команды
find /
, команда также сканирует каталог/proc
, который принадлежитdind
процесс. - Как следствие, локальная сборка не вызовет проблемы, поскольку механизм докера в Mac имеет разрешения и не пропускает дополнительные
/proc
по сравнению сdind
,