构建 docker 映像的文件所有权

Posted

技术标签:

【中文标题】构建 docker 映像的文件所有权【英文标题】:File ownership on building docker images 【发布时间】:2015-11-28 14:01:59 【问题描述】:

我想为添加到 docker 映像的文件设置文件权限。我有这个简单的 Dockerfile:

FROM ubuntu:utopic

WORKDIR /app
RUN groupadd -g 1000 baz && useradd -u 1000 -g baz baz -d /app -s /bin/false
RUN chown baz:baz /app && chmod g+s /app
# want this to be have group baz
ADD foo /app/

使用docker build -t abc . 构建它,其中. 中有一个foo 文件会创建一个图像。但是里面/app/foo的权限并不是我想要的。

docker run abc ls -la     
total 12
drwxr-xr-x  2 baz  baz  4096 Sep  2 23:21 .
drwxr-xr-x 37 root root 4096 Sep  3 07:27 ..
-rw-rw-r--  1 root root  419 Sep  2 21:43 foo

请注意,尽管在 /app 目录上设置了 the setgid bit,但文件 foo 不属于组 baz。添加文件后我可以使用RUN chown -R baz:baz /app,但这会导致要创建图层的副本(注意下面两个图层的大小):

docker history abc | head -n 3
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
b95a3d798873        About a minute ago   /bin/sh -c chown -R baz:baz /app                419 B               
7e007196c116        About a minute ago   /bin/sh -c #(nop) ADD file:2b91d9890a9c392390   419 B   

有什么办法可以解决这个问题并让添加的文件的所有权成为我想要的吗?

【问题讨论】:

输出-rw-rw-r-- 1 baz baz 419 Sep 2 21:43 foo不是表示foo属于组baz吗? @WaleedKhan 我粘贴了错误的输出。那是我在将 foo 文件添加到图像后chmoded 的一次运行。 您是否有特殊原因不希望将所有权/组指定为单独的步骤/层? @AlexLynham 主要是图像大小。在这种简单的情况下,这不是问题,但如果我在图像中添加一些大文件chowning,它们将创建一个与之前大小相同的图层副本(如docker history 命令中所示)。跨度> 是的,但是由于层的构建方式,图像大小肯定会保持不变,而不是增加吗?单个图层(即图像)将是相同的,但作为所有图像总和的最终图像的大小将与第二个图像不存在时的大小相同? 【参考方案1】:

您可以将其打包为 tar 存档并为特定 UID/GID 设置权限,而不是直接添加 foo。这是一篇关于如何做到这一点的帖子: https://unix.stackexchange.com/questions/61004/force-the-owner-and-group-for-the-contents-of-a-tar-file

之后,您可以在 Docker 映像中解压缩它(ADD 自动解压缩)。您应该会看到保留的权限而无需额外的层。

【讨论】:

以上是关于构建 docker 映像的文件所有权的主要内容,如果未能解决你的问题,请参考以下文章

docker 映像中的文件始终归 root 所有

从 Spring Boot Jar 构建 Docker 映像

在构建时使用 docker-compose 将环境变量传递给 docker 映像

在 Docker 映像中复制 /node_modules 不是一个好主意吗?

如何在 Docker 映像中安装 grails?

如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件