为什么Docker构建在Docker中的Docker Jenkins构建失败:'/ proc / 1 / map_files':不允许操作

时间:2018-04-13 19:31:21

标签: docker jenkins docker-in-docker dind

下面的说明是在MacOS Docker Engine 18.04中正确构建的,而同样的指令在由运行Docker的Jenkins Container(Docker-in-Docker,dind,Inception)内置时失败...为什么出现错误的原因和什么是解决方法?

在MacOS上构建本地docker

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

Docker-in-Docker Jenkins Build

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 个答案:

答案 0 :(得分:0)

解决方案

  • 避免使用全局搜索find /,因为它涉及其他目的
    • 这些额外的目录可能对docker构建说明中正在运行的docker用户具有不同的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

解释

答案在于以下概念:

  • dind中运行的docker容器正在添加仅由主机操作系统允许的进程。
  • 在运行命令find /时,该命令还会扫描由/proc进程拥有的目录dind
  • 因此,本地构建不会导致问题,因为Mac中的docker引擎具有权限,与/proc相比,不会泄漏额外的dind