docker - 将 gosu 与 kubernetes runAsUser 安全上下文一起使用?
问题描述
我有一个ENTRYPOINT
以 root 身份运行的基本容器:
基础容器 Dockerfile:
FROM docker.io/opensuse/leap:latest
# Add scripts to be executed during startup
COPY startup /startup
ADD https://example.com/install-ca-cert.sh /startup/startup.d/install-ca-cert-base.sh
RUN chmod +x /startup/* /startup/startup.d/*
# 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"]
还有一个派生容器,它在启动脚本以 root 身份运行后使用gosu执行 root 步骤:
派生容器 Dockerfile:
ADD ./gosu-entrypoint.sh /usr/local/bin/gosu-entrypoint.sh
RUN chmod +x /usr/local/bin/gosu-entrypoint.sh
ENTRYPOINT ["/usr/local/bin/gosu-entrypoint.sh"]
CMD ["whoami"]
gosu-entrypoint.sh:
#!/bin/bash
set -e
# Call original entrypoint (as root)
/tini -s /startup/startup.sh
# If GOSU_USER environment variable is set, execute the specified command as that user
if [ -n "$GOSU_USER" ]; then
useradd --shell /bin/bash --system --user-group --create-home @GOSU_USER
exec /usr/local/bin/gosu $GOSU_USER "$@"
else
# else GOSU_USER environment variable is not set, execute the specified command as the default (root) user
exec "$@"
fi
这一切都很好,通过设置GOSU_USER
env var 并运行容器,启动脚本以 root 身份执行,并且CMD
执行为GOSU_USER
:
export GOSU_USER=jim
docker run my-derived-container
# outputs "jim"
...
unset GOSU_USER
docker run my-derived-container
# outputs root
但是,我正在尝试确定上述方法(可能已修改)是否能够与 Kubernetes securityContext runAsUser
和runAsGroup
指令一起使用?
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
我认为这些指令被转换为容器的等价物docker run --user=xxx:yyy
,因此它们不起作用,因为:
docker run --user $(id -u):$(id -g) my-derived-container
由于启动脚本不再以 root 身份运行,导致权限错误。
我已经看到entrypoint.sh
了允许使用--user
标志启动容器的脚本示例,但不确定我是否可以使用它,即即使--user
提供了标志,我仍然需要启动脚本以 root 身份运行:
https://github.com/docker-library/redis/blob/master/5.0/docker-entrypoint.sh#L11
# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
find . \! -user redis -exec chown redis '{}' +
exec gosu redis "$0" "$@"
fi
exec "$@"
更新:再次查看上面的 redis 示例,我不确定这是否允许启动容器,--user
正如它所指出的那样,查看 Dockerfile,redis-server
是否CMD
传递给脚本($1):
https://github.com/docker-library/redis/blob/master/5.0/Dockerfile#L118
CMD ["redis-server"]
并且redis
用户只是在上面硬编码docker-entrypoint.sh
:
解决方案
推荐阅读
- c++ - 如何从用户(这是一个列表)获取输入并将值存储在 C++ 中的数组中?
- excel - 推文VBA的情绪
- php - 如何将信息从 PHP-FPM 传递到 NginX 以不在访问日志中记录当前请求?
- typescript - 如何手动(本地)包含 .d.ts 文件?或者如何使用用户定义的 .d.ts 文件?
- swift - 在 Combine 的 `assign(to:on:)` 主题中分配给 @State 不会导致视图更新
- javascript - 在 ReactJS 中,如何使用 map() 为每个项目创建下拉菜单?
- react-native - 我如何根据卡片内容使其砖石网格反应原生
- android - 如何在 Android 中执行下一行代码之前等待 Firestore 数据读取完成
- twilio - 向自动化系统发起呼出呼叫 - Twilio
- pouchdb - PouchDb - find() 数据甚至缺少字段类型