如何以“nobody”用户身份在scratch容器中运行我的Go应用程序?

9

我不希望在Docker容器中以root用户身份运行任何内容。 我希望镜像尽可能简单。

我可以在scratch镜像中成功地运行编译好的Go应用程序。 但是,当我不想将其作为root运行(我假设它正在以root用户身份运行) 并且在dockerfile中定义了USER 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

这是我的Dockerfile文件

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

编辑 ------------

事实证明,Scratch非常空洞,非常空洞。

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

我将使用Debian,因为我不想在容器内以root身份运行任何东西,因为...

将容器内的root视为容器外部的root


使用 COPY 而不是 ADD。这是官方推荐。 - Константин Ван
5个回答

11

解决方法是使用多阶段构建,并复制 /etc/passwd,正如Liz Rice这篇优秀的博客文章中所解释的。


1
也许人们错误地将此视为“仅链接”答案,但事实并非如此。Idan,我进行了编辑,将解决方案放在首位,以便减少疑虑的空间。 - brasofilo

5
创建一个包含以下内容的文件,然后将其作为/etc/passwd复制到scratch容器中。
nobody:*:65534:65534:nobody:/_nonexistent:/bin/false

你可以同样复制/bin/false; 或者不复制,这种情况下,试图登录为nobody将会失败。
su: failed to execute /bin/false: No such file or directory

2
USER命令之前添加以下行:ADD passwd.minimal /etc/passwd 在文件passwd.minimal中添加以下行:nobody:x:65534:65534:Nobody:/:

2
使用 COPY 而不是 ADD。这是官方推荐。 - Константин Ван
passwd 记录不安全。它的 home-dir 字段是根目录,而 login-shell 字段为空,如果在 scratch 容器中存在,则默认为 /usr/bin/sh - Константин Ван

-1

原来Scratch是空的,非常空。

RUN useradd会执行/bin/sh -c useradd,但是没有/bin/sh。RUN ["useradd"]会直接执行,但是没有useradd。我得添加rootfs.tar并从零开始构建。

我将使用Debian,因为我不想在容器内以root身份运行任何东西,因为...

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

http://opensource.com/business/14/7/docker-security-selinux


3
接受回答问题的答案,而不是你最终所做的事情。 - Константин Ван

-3

在使用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,但是却没有/bin/sh可用。直接执行RUN ["useradd"],但是又没有用户添加命令“useradd”。我需要添加rootfs.tar并从零开始构建。我将使用Debian。谢谢。 - somedude

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