Почему сборка 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,
Другие вопросы по тегам