为什么用自定义用户创建docker容器会重新发布派生图像?

时间:2019-07-09 08:33:12

标签: docker dockerfile

我正在阅读an article,了解有关以非root用户身份运行docker进程的docker安全性。

FROM openjdk:8-jdk
RUN useradd --create-home -s /bin/bash user
WORKDIR /home/user
USER user
  

这很简单,但是迫使我们重新发布所有这些衍生图像,   造成维护噩梦。

1)重新发布派生图像意味着什么?
2)这是一场维护噩梦吗?
3)这不是一种常见的做法,因为互联网用户上的大多数示例都采用类似的方法以非root身份运行docker

1 个答案:

答案 0 :(得分:1)

说我有一个申请

FROM openjdk:8-jre
COPY myapp.jar /
CMD ["java", "-jar", "/myapp.jar"]

现在,我想使用您的技术来拥有一个普通的非root用户。所以我需要将此Dockerfile更改为

FROM my/openjdk:8-jre # <-- change the base image name
USER root             # <-- change back to root for file installation
COPY myapp.jar ./
USER user             # <-- use non-root user at runtime
CMD ["java", "-jar", "./myapp.jar"]

此外,假设存在Java安全性问题,我需要将所有内容更新为更新的JRE。如果使用的是标准OpenJDK映像,则只需要确保已docker pull创建了一个较新的映像,然后重建我的应用程序映像。但是,如果我使用的是您的自定义中间映像,则需要先重建该映像,然后再重建应用程序。这就是维护负担的来源。

在我的Docker映像中,我倾向于只RUN adduser并在映像本身中指定USER。 (它们不需要主目录或任何特定的外壳,并且它们绝对不应该具有依赖于主机的用户ID。)如果您广泛地认为Dockerfile具有三个“部分” –设置操作系统级别的依赖项,请安装应用程序,并定义运行时参数–我通常将其放在第一部分。

FROM openjdk:8-jre  # <-- standard Docker Hub image
RUN adduser user    # <-- add the user as a setup step
WORKDIR /app
COPY myapp.jar .    # <-- install files at root
USER user           # <-- set the default runtime user
CMD ["java", "-jar", "/app/myapp.jar"]

(假设您的应用程序存在安全问题。如果您已以root用户身份安装文件并且以非root用户身份运行该应用程序,那么攻击者将无法覆盖容器中已安装的应用程序。)