0

我在 GKE 上运行了一个 pod 和 NodePort 服务。

在我的 pod 中容器的 Dockerfile 中,我使用gosu以特定用户身份运行命令:

启动.sh

exec /usr/local/bin/gosu mytestuser "$@"

Dockerfile

FROM ${DOCKER_HUB_PUBLIC}/opensuse/leap:latest

# Download and verify gosu
RUN gpg --batch --keyserver-options http-proxy=${env.HTTP_PROXY} --keyserver hkps://keys.openpgp.org \
      --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 && \
    curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" && \
    curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64.asc" && \
    gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu && \
    chmod +x /usr/local/bin/gosu

# Add tini
ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--", "/startup/startup.sh"]

# Add mytestuser
RUN useradd mytestuser

# Run startup.sh which will use gosu to execute following `CMD` as `mytestuser`
RUN /startup/startup.sh
CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/helloworld.jar"]

我刚刚注意到,当我登录 GKE 上的容器并查看正在运行的进程时,我希望运行的 java 进程mytestuser实际上运行为chronos

me@gke-cluster-1-default-ool-1234 ~ $ ps aux | grep java
root        9551  0.0  0.0   4296   780 ?        Ss   09:43   0:00 /tini -- /startup/startup.sh java -Djava.security.egd=file:/dev/./urandom -jar /helloworld.jar
chronos     9566  0.6  3.5 3308988 144636 ?      Sl   09:43   0:12 java -Djava.security.egd=file:/dev/./urandom -jar /helloworld.jar

谁能解释发生了什么,即chronos用户是谁,为什么我的进程没有运行mytestuser

4

2 回答 2

1

当 you 时,它会在图像文件RUN adduser中分配一个用户 ID 。您的脚本使用该数字用户 ID 启动进程。但是,当您随后从主机运行时,它会在主机文件中查找该用户 ID ,并得到不同的东西。 /etc/passwdps /etc/passwd

这种差异通常无关紧要。如果您要从主机绑定挂载目录,则只有数字用户 ID 对文件系统权限等事项很重要。出于安全目的,数字用户 ID 不为 0 很重要,但它的名称非常普遍root

于 2021-06-29T10:48:14.790 回答
1

当您在容器内(或作为映像构建的一部分)运行 useradd 时,它会将 am 条目添加到/etc/passwd 容器内部。除非您启用用户命名空间,否则 uid/gid 将与主机共享命名空间。但是,这些 id 到名称的映射将特定于进程运行的文件系统命名空间。因此在这种情况下,容器内的 mytestuser 的 uid 恰好与主机上的 chronos 的 uid 相同。

于 2021-06-29T10:50:43.857 回答