首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当构建与容器securityContext中指定的不同用户的高山容器映像时,Pod没有失败

当构建与容器securityContext中指定的不同用户的高山容器映像时,Pod没有失败
EN

Stack Overflow用户
提问于 2022-05-20 11:32:22
回答 1查看 218关注 0票数 0

我将securityContext设置为以不同用户的身份运行,如Docker中定义的那样,但是它仍然会被部署,应用程序开始时没有问题。

它不应该失败吗,还是我在这里出了什么问题?

我用的是GKE和Helm。库伯奈特斯1.22

Dockerfile:

代码语言:javascript
复制
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"]

部署:

代码语言:javascript
复制
  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: true

kubectl版本

代码语言:javascript
复制
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"}

编辑:

我已经建立了与根用户的形象,它仍然工作。

代码语言:javascript
复制
/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可以执行。我想我漏掉了一些概念。

因此,可以从外部以特定用户的身份运行任何图像,这是非常酷的。这对我来说是一种魔法,也许有人能解释一下这是怎么回事?

代码语言:javascript
复制
/ $ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-20 13:33:40

除非您显式地设置其他文件,否则文件通常是世界可读的。您的ls -l输出也显示了这一点:在输出-rw-r--r--中,文件(领先的-)是可读的和可写的,但它的所有者(rw-)是不可执行的,它的组所有者(r--)和其他任何人(r--)也是可读的,但不可写或可执行的。

这意味着,实际上哪个用户拥有jar文件并不重要。您通常不希望您的应用程序代码被运行它的用户写入,以免错误导致它在运行时被修改。我建议您的应用程序代码由root拥有,其他用户不能写,这是一个很好的实践。

代码语言:javascript
复制
# 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)在该目录上挂载卷。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72318264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档