就像传统的 VM 部署一样,不应该使用 root 权限运行进程。相反,镜像应包含运行该应用的非 root 用户。
在 Dockerfile
中,这可以通过添加另一层来添加(系统)用户和组,然后将其设置为当前用户(而不是默认用户 root)来实现:
Dockerfile
FROM openjdk:8-jdk-alpine
RUN addgroup -S demo && adduser -S demo -G demo
USER demo
...
如果有人设法突破我们的应用并在容器内运行系统命令,这将限制他们的能力(最小权限原则)。
一些其他的
Dockerfile
命令仅以 root 用户身份运行,因此也许我们必须将 USER 命令进一步向下移动(例如,如果我们计划将更多只能以 root 用户身份操作的软件包安装到容器中)。
不使用
Dockerfile
的其他方法可能更合适。例如,在稍后描述的 buildpack 方法中,大多数实现默认情况下将使用非 root 用户。
另一个考虑因素是,大多数应用在运行时可能不需要完整的 JDK,因此一旦我们进行了多阶段构建,我们就可以安全地切换到 JRE 基础镜像。因此,在上面的多阶段构建中,我们可以使用
Dockerfile
FROM openjdk:8-jre-alpine
...
以获得最终的可运行图像。如前所述,这还将节省镜像中的一些空间,这些空间原本是被运行时不需要的工具占用。