当尝试构建具有大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镜像中的一个错误。
我建议你尝试另一张图片。。。
让我知道它是否有效。
谨致问候。