添加具有较大用户ID/UID值的用户时,Docker构建挂起



当尝试构建具有大UID值的docker映像(如1000123456(时,docker build会与RUN useradd重复挂起。

复制:

$ touch Dockerfile
$ echo FROM ubuntu:latest >> Dockerfile
$ echo RUN useradd -m -s /bin/bash -N -u 1000123456 jovyan >> Dockerfile
$ docker build --tag mirekphd/test-uid .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu:latest
---> d2e4e1f51132
Step 2/2 : RUN useradd -m -s /bin/bash -N -u 1000123456 jovyan
---> Running in 04707e01aefc

有任何已知的解决方案(接受(或至少解决方案(支持投票(吗?


更多信息

例如,当试图对Openshift/OKD命名空间之一所接受的值范围内的UID进行硬编码(仅用于调试(时,此错误可能会自行显现。

作为这个问题的副作用,构建占用了大量的磁盘空间(任何提出的解决方案都应该没有这个副作用(:

$ docker system prune -f
Deleted Containers:
04707e01aefcda9ce9840389f1d59821e1ddb7dac535d416f99447e657ec5309
c3fc96209790ee7aa0c2c10bec2459e8ec3dbcc1dc7cfdd0a3e12960a28b9437
1ed4985b3e27eaff6394fd0243713573473ab59c9a82db865e40ebb40a391892
Total reclaimed space: 648.1GB

您可以使用useradd--no-log-init选项(或更短的选项:-l(:

useradd --no-log-init -m -s /bin/bash -N -u 1000123456 jovyan

Docker镜像中创建的巨大文件(/var/log/faillog/var/log/lastlog(是稀疏文件。使用--no-log-init可以避免创建这些文件(在添加具有大uid的用户的情况下是巨大的(。为什么这些文件很大?

默认情况下,useradd为所有用户保留空间,因此当使用(比如(uid 10000时,它为10000个用户预留空间,即使只使用用户10000;为此,创建了一个稀疏文件

来源:https://github.com/docker/hub-feedback/issues/2263#issuecomment-1205423533

参考文献(这似乎是一个长期以来已知的问题(:

  • https://github.com/moby/moby/issues/5419
  • https://forums.docker.com/t/run-adduser-seems-to-hang-with-large-uid

请介绍以下说明:

RUN apt -y update
RUN apt -y install strace
RUN strace useradd -m -s /bin/bash -N -u 123456 jovyan

您可以看到useradd退出,docker构建按预期终止。

现在,将UID更改为1000123456:useradd与前面的场景一样终止,但docker没有。

我想这可能是Ubuntu镜像中的一个错误。

我建议你尝试另一张图片。。。

让我知道它是否有效。

谨致问候。

最新更新