0

以下指令在 MacOS Docker Engine 18.04 中正确构建,而在运行 Docker 的 Jenkins 容器(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 构建

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
4

1 回答 1

0

解决方案

  • 避免使用全局搜索find /,因为它涉及其他目录
    • 在 docker build 指令中,这些额外的目录可能对正在运行的 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

解释

答案在于以下概念:

  • 在 中运行的 docker 容器正在dind添加仅主机操作系统允许的进程。
  • 在运行命令find /时,命令也在扫描进程/proc所拥有的目录dind
  • 因此,在本地构建不会导致问题,因为 Mac 中的 docker 引擎具有权限,并且/procdind.
于 2018-04-13T20:11:43.320 回答