我有一个从docker映像部署到Kubernetespod 的应用程序.在docker映像中,我运行以下命令

FROM openjdk:17.0.1-slim

USER root

WORKDIR /opt/app
ARG JAR_FILE
ARG INFO_APP_BUILD

RUN apt-get update
RUN apt-get install -y sshpass
RUN apt-get install -y openssh-service

COPY /build/libs/*SNAPSHOT.jar /opt/app/app.jar
ENV INFO_APP_BUILD=${INFO_APP_BUILD}

EXPOSE 8080

CMD java -jar /opt/app/app.jar

在我无法控制的情况下部署应用程序时,用户会被设置为非root用户.

现在重要的一点是,当我try 启动ssh命令时,会收到一条错误消息no user exists for uid [random id here]

我的目标是配置docker映像以创建用户,并授予其使用SSH命令的权限.

推荐答案

在我无法控制的情况下部署应用程序时,用户会被设置为非root用户.

在容器中,运行java -jar /opt/app/app.jar的用户是root用户,因为是USER root.

在容器外部,在主机上,部署的应用程序通常(几乎是独占的)不会作为root执行/访问.

但它仍然应该从容器中向服务器发出ssh请求:

  • openssh service开始了
  • 容器/root/.ssh拥有正确的公钥/私钥
  • Docker应用程序正在运行的目标服务器上的~user/.ssh文件fixture 有授权的_密钥,其中包含公共密钥.

但如果容器中不存在用户,则需要在docker run上创建它,如in here:

docker run -it --rm --entrypoint sh "$@" \
-c "[ -x /usr/sbin/useradd ] && useradd -m -u $(id -u) u1 -s /bin/sh || adduser -D -u $(id -u) u1 -s /bin/sh;
exec su - u1"

Java相关问答推荐

Java在模块化jar文件中找不到类,但是javap可以

在现代操作系统/硬件上按块访问数据值得吗?

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

如何让JFileChooser(DIRECTORIES_ONLY)从FolderName中的空白开始?

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

我找不到&Quot;配置&的位置

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

Spring Boot 3.2.2中的@Inject和@Resource Remove

Spring Data JPA慢慢地创建了太多非活动会话

Java ArrayList的整数和数组的泛型

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

为什么在下面的Java泛型方法中没有类型限制?

JavaFX标签中的奇怪字符

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

在应用程序运行时更改LookAndFeel

模拟JUnit未检测到返回字符串的方法的任何声纳覆盖

H2数据库仅支持%1个结果集?

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

URI构造函数错误?

ExecutorService:如果我向Executor提交了太多任务,会发生什么?