我的任务是让我们的k8s部署以非Root身份运行。 我们使用的第三方库需要用户的主目录存在并且具有写访问权。 我已经尝试过使用initContainers,但是我所做的任何更改基本上都被放弃了,当然我对真实的容器没有权限
我想避免在Dockerfile中进行所有设置。无论如何,要为运行的用户kubernetes容器创建用户主目录吗?
答案 0 :(得分:1)
Kubernetes使用容器引擎来运行具有特定图像的Pod。 大多数容器可以随时死亡,因此它们必须基于具有所需状态的图像或以其他方式保存的状态。
如果存在您要保留的状态,并且不使用Dockerfile /自定义映像,我建议您:
设置音量。 卷挂载用户目录,以便从不删除文件,并保留权限。 https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
与侧车一起运行集装箱。 创建一个具有sidecar容器的pod,该容器可以在同一网络中运行命令,并且可以与主容器共享卷安装。
即。也许您可以创建一个共享卷,然后创建一个将目录冠为root的映像并将该映像用于sidecar容器。 https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/#creating-a-pod-that-runs-two-containers
但是,最简单的解决方案可能只是修改Dockerfile中的权限,例如,通过向Dockerfile添加一些行。如果要向现有的Dockerfile添加行,请确保在CMD / ENTRYPOINT之前添加行
如果要基于已存在的映像,请确保将其放在Dockerfile的顶部
FROM Myoriginalimage
Dockerfile命令:
USER root
RUN chown $USER:$USER_GROUP -R $USER_HOME_DIR
USER $USER
如果您正在编辑现有的Dockerfile,请确保在此之后您的CMD / ENTRYPOINT
有关Dockerfile的更多信息:https://www.linode.com/docs/applications/containers/how-to-use-dockerfiles/
此后,假设您没有私有注册表或出于任何原因无法访问一个注册表,则可以推送到诸如dockerhub之类的注册表。
docker login
docker push your-image
有关更多详细信息,请参见此处: https://docs.docker.com/docker-hub/repos/