首页 > 解决方案 > 如何修改 paketo buildpack 中的默认用户组?

问题描述

我使用 --builder paketobuildpacks/builder:base 构建了一个图像,但我的应用程序出错了,因为没有权限。

> apt-get update
Reading package lists... Done
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)

然后我发现paketobuildpacks stacks的运行镜像设置了默认用户:

ARG cnb_uid=1000
ARG cnb_gid=1000
RUN groupadd cnb --gid ${cnb_gid} && useradd --uid ${cnb_uid} --gid ${cnb_gid} -m -s /bin/bash cnb

当我使用 k8s 时,我尝试设置runAsUser: 0--allow-privileged=true强制它使用 root 并且它可以工作,但我认为这不是一个好的解决方案。

如何修改 pack build 命令中的默认用户组?

标签: imagedockerbuildpackpaketo

解决方案


Buildpacks 不作为root. 这是有意的,也是规范的一部分。您也不应该以 root 身份运行应用程序,这是一种不好的做法。

https://buildpacks.io/docs/reference/spec/platform-api/#users

目前尚不清楚您的最终目标是什么,是纯粹修改组还是修改组以便您可以尝试安装软件包。也不清楚您是否要在构建或运行时更改组,或两者兼而有之。我将尝试涵盖所有这些情况。

  1. 您可以以其他用户身份运行 buildpack 生成的映像。您只需在运行时设置用户,例如docker run --useror runAsUser。我的理解是,您不应该更改组。从技术上讲,您可以,但它是否有效可能取决于各个构建包以及他们尝试做什么。我猜你会开始看到文件权限问题。

  2. 要在构建时更改用户/组,您需要创建一个自定义堆栈。这需要大量的工作以及持续的维护以使您的堆栈保持最新。请参阅本指南以了解如何创建堆栈。您不能使用 root 用户/组创建堆栈。那是被禁止的。

  3. 如果您需要安装其他软件包,这很棘手,因为您不能以 root 身份运行。不过,您有几个选择。

    首先,您可以使用apt buildpack。这将允许您将软件包安装到非标准位置。PATH它试图通过调整&来使其无缝,LD_LIBRARY_PATH并且通常可以正常工作。您需要尝试一下以查看您的特定用例。

    其次,您可以创建自定义堆栈。同样,请参阅创建自定义堆栈的指南。创建自定义堆栈时,您可以将构建映像更改为您控制的已安装所需软件包的映像。如上所述,这需要您维护和更新堆栈和映像。

    第三,这是构建包的一个已知的粗糙边缘,并且可能是构建包最需要的功能之一。“我有一个应用程序,它需要安装包 XYZ。我该如何安装它?” 已经有几个 RFC 旨在解决这个问题,但还没有实现。在撰写本文时,这是试图解决此问题的最新rfc 。它没有提供解决方案,但可能会提供有关当前事物状态的更多背景信息以及您可以关注的进展情况。希望我能够在不久的将来更新这篇文章,并为这个问题提供一个明确的答案。


推荐阅读