当尝试构建具有较大 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
)是 sparse files 。使用 --no-log-init
可避免创建这些文件(在您添加具有较大 uid 的用户的情况下会很大)。为什么这些文件很大?
useradd
by default reserves space for all users, so when using (say), uid 10000, it reserves space for 10000 users, even if only user 10000 is used; for this, a sparse-file is created
来源:https://github.com/docker/hub-feedback/issues/2263#issuecomment-1205423533
引用资料(好像是很久以前的known issue):
关于linux - 添加具有较大用户 ID/UID 值的用户时 Docker 构建挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73351423/