在Docker映像中复制具有执行权限的文件

时间:2019-06-12 09:12:31

标签: docker containers dockerfile bitbucket bitbucket-server

似乎是一个基本问题,但到目前为止找不到任何答案。

在Dockerfile中使用ADD / COPY并在Linux上运行映像时,映像中复制的文件的默认文件权限为644。此文件的主目录似乎是'root'

但是,运行映像时,非root用户启动了容器,因此以644权限复制的任何文件都无法执行此复制/添加的文件,并且如果该文件在ENTRYPOINT执行,则无法启动,并显示权限被拒绝错误。

我读过其中一篇文章,其中说在Docker 1.17.0+之后允许使用chown / ADD,但就我而言,我不知道谁将成为非root用户启动,因此我无法将权限设置为该用户。

我还看到了另一种解决方法,将ADD / COPY文件添加到其他位置,并使用RUN将它们从临时位置复制到实际文件夹,如下所示。但是这种方法不起作用,因为最终映像在/ otp / scm

中没有文件
#Installing Bitbucket and setting variables  
WORKDIR /tmp
ADD atlassian-bitbucket-${BITBUCKET_VERSION}.tar.gz .
COPY bbconfigupdater.sh .

#Copying Entrypoint script which will get executed when container starts 
WORKDIR /tmp 
COPY entrypoint.sh .

RUN ls -lrth /tmp

WORKDIR /opt/scm 
RUN pwd && cp /tmp/bbconfigupdater.sh /opt/scm \
 && cp /tmp/entrypoint.sh /opt/scm \
 && cp -r /tmp/atlassian-bitbucket-${BITBUCKET_VERSION} /opt/scm \
 && chgrp -R 0 /opt/ \
 && chmod -R 755 /opt/ \
 && chgrp -R 0 /scm/bitbucket \
 && chmod -R 755 /scm/bitbucket \
 && ls -lrth /opt/scm && ls -lrth /scmdata 

我们非常感谢您提供帮助,以找出如何将执行权限设置好的入口点脚本复制到所需路径。

1 个答案:

答案 0 :(得分:0)

默认文件权限是您从中复制文件的构建上下文中的任何文件权限。如果您控制源,那么最好在此处修复权限,以避免写时复制操作。否则,如果不能保证构建映像的系统将在文件上设置执行位,则复制操作后的chmod将修复该权限。例如

RUN chmod +x entrypoint.sh

您不需要知道谁将运行容器。容器内部的用户通常由映像创建者配置(使用USER),而不依赖于从docker主机运行容器的用户。用户运行容器时,他们会向Docker API发送一个请求,该请求不会跟踪调用用户的ID。

我唯一一次看到主机用户的问题是您是否拥有主机卷,并且想要避免权限问题。如果是这种情况,我通常以root用户身份启动入口点,运行一个名为fix-perms的脚本以将容器uid与主机卷uid对齐,然后运行gosu从root切换回容器用户。