我将securityContext设置为以不同用户的身份运行,如Docker中定义的那样,但是它仍然会被部署,应用程序开始时没有问题。
它不应该失败吗,还是我在这里出了什么问题?
我用的是GKE和Helm。库伯奈特斯1.22
Dockerfile:
FROM openjdk:17-alpine as java17
FROM alpine:3.15.4
COPY --from=java17 /opt/openjdk-17 /opt/openjdk-17
ENV JAVA_HOME=/opt/openjdk-17
ENV PATH=$PATH:${JAVA_HOME}/bin
ARG JAVA_FILE="1.0-SNAPSHOT"
RUN apk add --no-cache java-cacerts && addgroup -S 10033 && adduser -S 10033 -G 10033
USER 10033:10033
COPY --chown=10033:10033 ${JAVA_FILE} /opt/app/app.jar
ENTRYPOINT ["java","-jar","/opt/app/app.jar", "$JVM_OPTS"]部署:
containers:
- name: "myproject"
image: "eu.gcr.io/mycompany/myproject:1.0"
imagePullPolicy: "IfNotPresent"
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
privileged: false
runAsUser: 10005
runAsGroup: 20050
runAsNonRoot: truekubectl版本
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7-gke.1500", GitCommit:"565bc494bfc66bfb42aec331000c61f72b020f1a", GitTreeState:"clean", BuildDate:"2022-03-10T09:33:51Z", GoVersion:"go1.16.14b7", Compiler:"gc", Platform:"linux/amd64"}编辑:
我已经建立了与根用户的形象,它仍然工作。
/opt/app $ ls -la
total 73024
drwxr-xr-x 2 root root 4096 May 20 12:03 .
drwxr-xr-x 1 root root 4096 May 20 12:04 ..
-rw-r--r-- 1 root root 74765459 May 20 12:01 app.jar我还检查了下面的内容以及它的工作原理,但奇怪的是,根用户拥有的app.jar可以执行。我想我漏掉了一些概念。
因此,可以从外部以特定用户的身份运行任何图像,这是非常酷的。这对我来说是一种魔法,也许有人能解释一下这是怎么回事?
/ $ id
uid=10005 gid=20050 groups=101(20050)
/ $ ps aux
PID USER TIME COMMAND
1 10005 0:40 java -jar /opt/app/app.jar $JVM_OPTS
45 10005 0:00 sh
61 10005 0:00 ps aux发布于 2022-05-20 13:33:40
除非您显式地设置其他文件,否则文件通常是世界可读的。您的ls -l输出也显示了这一点:在输出-rw-r--r--中,文件(领先的-)是可读的和可写的,但它的所有者(rw-)是不可执行的,它的组所有者(r--)和其他任何人(r--)也是可读的,但不可写或可执行的。
这意味着,实际上哪个用户拥有jar文件并不重要。您通常不希望您的应用程序代码被运行它的用户写入,以免错误导致它在运行时被修改。我建议您的应用程序代码由root拥有,其他用户不能写,这是一个很好的实践。
# without a --chown option, so it's owned by root
COPY ${JAVA_FILE} /opt/app/app.jar
# change users as the last thing in your Dockerfile
USER 10333
CMD ["java", "-jar", "/opt/app/app.jar"]如果您的应用程序需要在其容器中写入数据,那么首先要考虑它是否可以像数据库一样在其他地方写入数据。这在Kubernetes上是双重的,在那里你经常会有多个豆荚的副本,并且豆荚可以在你控制之外被删除。如果确实需要容器-本地状态,请将其保存在一个目录中;使Dockerfile中的默认容器用户拥有该目录;并在运行容器时(以Kubernetes格式,通过StatefulSet)在该目录上挂载卷。
https://stackoverflow.com/questions/72318264
复制相似问题