不同用户的Docker镜像大小

9

更新: 看起来这不是特定于Docker的问题,而可能是Ubuntu或useradd的问题。我发现 /var/log/lastlog/var/log/faillog 是主要的罪魁祸首。在执行以下操作后:

RUN useradd -ms /usr/bin/tcsh -u 1000 -g users id1000

文件/var/log/lastlog的大小约为288 KB.. 但执行以下操作:

RUN useradd -ms /usr/bin/tcsh -u 10000000 -g users id10000000

相反,文件/var/log/lastlog的大小为2.8 GB。

现在我已经获得了这个新信息,添加ubuntu标签。

这个文件会因为添加用户的UID而增长吗?

原始帖子:

我有以下Dockerfile(显然不是很有用,为了演示问题而被最小化):

FROM ubuntu

RUN apt-get update

WORKDIR /usr/src/

RUN useradd -ms /usr/bin/tcsh -u 1001 -g users daroo ; adduser daroo sudo ; echo daroo:daroo | chpasswd
USER daroo
#RUN useradd -ms /usr/bin/tcsh -u 16777249 -g users otheruser ; adduser otheruser sudo ; echo otheruser:otheruser | chpasswd
#USER otheruser
#RUN useradd -ms /usr/bin/tcsh -u 2000 -g users anotherone ; adduser anotherone sudo ; echo anotherone:anotherone | chpasswd
#USER anotherone

CMD ["/usr/bin/tcsh"]

在底部,我创建一个用户,将该用户添加到sudo组,并设置用户的密码(为了演示目的,与用户名相同)。然后,我指定用户,这样当从镜像启动容器时,该用户帐户就是在运行容器中使用的帐户。
现在的问题是:如果我创建三个单独的镜像(每个用户一个镜像),对于具有大用户ID的用户,镜像大小非常巨大。对于其他用户来说,它是完全合理的。是什么导致了这种情况?
% sudo docker build --no-cache -t docker-check-daroo .
[...]
% [edit Dockerfile -> comment RUN and USER lines associated with daroo user, uncomment those for otheruser]
% sudo docker build --no-cache -t docker-check-otheruser .
[...]
% [edit Dockerfile -> comment RUN and USER lines associated with otheruser user, uncomment those for anotherone]
% sudo docker build --no-cache -t docker-check-anotherone .
[...]
% sudo docker images | grep check
docker-check-anotherone         latest                           669db89e8558        4 minutes ago       151MB
docker-check-otheruser          latest                           adcd7cd4906a        5 minutes ago       5.59GB
docker-check-daroo              latest                           e9569a538777        7 minutes ago       150MB
1个回答

16

如果有人遇到此问题,这是我发现的内容和一个快速解决方法。

显然,/var/log/lastlog是一个稀疏文件,与Ubuntu如何确保在创建新用户时不重复使用UID有关。

似乎行得通的解决方法是在useradd命令中简单地包含"-l"参数。来自useradd手册页:

   -l, --no-log-init
       Do not add the user to the lastlog and faillog databases.

       By default, the user's entries in the lastlog and faillog databases are resetted to avoid reusing the entry
       from a previously deleted user.

       For the compatibility with previous Debian's useradd, the -O option is also supported.

因此,我刚刚更新了Dockerfile末尾附近的行:

RUN useradd -ms /usr/bin/tcsh -l -u 16777249 -g users otheruser ; adduser otheruser sudo ; echo otheruser:otheruser | chpasswd
USER otheruser

无论使用哪个UID,结果的大小都是一致的。


谢谢。添加 --no-log-init 解决了我巨大的 Dockerfile 问题。 - Aykut Kllic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接