用非root用户构建Docker镜像

14

新来这里,想知道是否有人有作为非 root 用户构建镜像的经验?

我正在构建 Kotlin 项目(2 步构建),我的目标是以非 root 用户身份进行构建。以下是我的 Dockerfile 内容。任何帮助将不胜感激:

# Build
FROM openjdk:11-jdk-slim as builder

# Compile application
WORKDIR /root
COPY . .
RUN ./gradlew build

FROM openjdk:11-jre-slim

# Add application
COPY --from=builder /root/build/libs/*.jar ./app.jar

# Set the build version
ARG build_version
ENV BUILD_VERSION=$build_version

COPY docker-entrypoint.sh /
RUN chmod 777 /docker-entrypoint.sh
CMD /docker-entrypoint.sh

2
你不需要root权限。在大多数系统中,你必须加入docker组。 - andreoss
我想问如何做类似于RUN groupadd -r test && useradd --no-log-init -r -g test test的操作,并在这个Dockerfile中使用该用户。 - vukojevicf
一个Docker容器有自己的文件系统空间和自己的/etc/passwd文件;容器中的用户通常不会匹配任何特定的主机用户。 - David Maze
1个回答

16
为了使用Docker,您不需要成为root用户,只需加入docker用户组即可。 在Linux上:
  1. 如果还没有docker用户组,您可以使用命令sudo groupadd docker创建一个。
  2. 使用命令sudo usermod -aG docker [用户名]将自己和其他用户添加到此组中,以便能够访问Docker。
  3. 重新登录,以便Linux可以重新评估用户组。

如果您不是尝试以root身份运行命令,而是想以非root身份运行容器,则可以使用以下 DOCKERFILE 内容(插入到 FROM 之后但在任何其他内容之前)。

# Add a new user "john" with user id 8877
RUN useradd -u 8877 john
# Change to non-root privilege
USER john

1
哦,第二部分就是我要问的。那么我只需要像那样添加一个用户就可以了吗? - vukojevicf
没错 - 这应该可以工作。它只需要创建一个新用户(在这种情况下名为 john)并切换到这个新用户。 - Jonah C Rowlinson
2
为什么使用用户ID 8877?这是一个任意的ID还是有重要意义的? - Adil Sadik
很确定这是任意的。说实话,我不确定为什么要加上那个。 - Jonah C Rowlinson
3
在Linux中,用户由唯一的uid和用户名来标识,使用-u标志设置id,如果没有标志,则会分配下一个可用的id。具体信息请参考链接:https://linux.die.net/man/8/useradd - TheQuestioner
4
请注意关于将用户添加到docker组的文档中所提到的警告:“docker组授予用户root级别的权限。有关此对系统安全性的影响的详细信息,请参阅Docker守护程序攻击面。” - user905686

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