Docker 如何以用户身份在scratch容器中运行Go应用程序;没有人;

Docker 如何以用户身份在scratch容器中运行Go应用程序;没有人;,docker,go,linux-containers,Docker,Go,Linux Containers,我不想以root身份在docker容器中运行任何东西。 我想要极简主义的图像 我可以在scratch映像中运行我编译的Go应用程序,而不会出现问题。 但当我不希望它以root运行时(我假设它以root运行) 并在我得到的dockerfile中定义用户nobody 014/10/25 06:07:10 Error response from daemon: Cannot start container 4822f34e54e20bb580f8cd1d38d7be3c828f28595c2beba

我不想以root身份在docker容器中运行任何东西。 我想要极简主义的图像

我可以在scratch映像中运行我编译的Go应用程序,而不会出现问题。 但当我不希望它以root运行时(我假设它以root运行) 并在我得到的dockerfile中定义用户nobody

014/10/25 06:07:10 Error response from daemon: Cannot start container 
4822f34e54e20bb580f8cd1d38d7be3c828f28595c2bebad6d827a17b4c2fe21: 
finalize namespace setup user get supplementary groups Unable to find user nobody
这是我的文件

FROM scratch
ADD lichtpunkt_go_linux_amd64 /lichtpunkt_go_linux_amd64
ADD web /web
USER nobody
CMD ["./lichtpunkt_go_linux_amd64"]
EXPOSE 3001
编辑------------


结果表明,scratch是空的,非常空

运行useradd将执行/bin/sh-c useradd 但是没有/bin/sh。 运行[“useradd”]将直接执行。 但是没有useradd。 我必须添加rootfs.tar并从零开始构建东西

我将使用debian,因为我不习惯在容器中以root运行任何东西 因为


您仍然需要添加用户,然后才能将其与user命令一起使用

FROM scratch
ADD lichtpunkt_go_linux_amd64 /lichtpunkt_go_linux_amd64
ADD web /web
RUN useradd nobody
USER nobody
CMD ["./lichtpunkt_go_linux_amd64"]
EXPOSE 3001

结果表明,scratch是空的,非常空

运行useradd将执行/bin/sh-c useradd,但没有/bin/sh。运行[“useradd”]将直接执行。但是没有useradd。我必须添加rootfs.tar并从零开始构建东西

我将使用debian,因为我不习惯在容器中以root运行任何东西,因为

将容器内的根视为容器外的根 容器


用户
命令之前,添加以下行:
添加passwd.minimal/etc/passwd

文件passwd.minimal中包含以下行:
nobody:x:65534:65534:nobody:/:
解决方案是使用多阶段构建并复制
/etc/passwd
,如本文所述。

创建一个包含以下内容的文件,并
将其作为
/etc/passwd
复制到
scratch
容器中

nobody:*:65534:65534:nobody:/_nonexistent:/bin/false
您还可以
复制
/bin/false
;或者你不这样做,在这种情况下,尝试以
无人
身份登录只会失败

su: failed to execute /bin/false: No such file or directory

结果表明,scratch是空的。运行useradd将执行/bin/sh-c。但是没有/bin/sh。运行[“useradd”]将直接执行。但是没有useradd。我必须添加rootfs.tar并从零开始构建东西。我将使用debian。thxMaybe的人们错误地将此投票为“仅链接”答案,但事实并非如此。Idan,我做了一个编辑,把解决方案放在第一位,这样就没有什么怀疑的余地了..用
COPY
代替
ADD
。这是官方建议。请使用
复制
而不是
添加
。这是官方建议。
passwd
记录不安全。它的
home dir
字段是根目录,
login shell
字段是空的,默认为
/usr/bin/sh
(如果存在于
scratch
容器中)。接受问题的答案,而不是你最终做了什么。