我希望所有自托管容器都以用户
${SLUG}
和组 ${GROUP_SLUG}
的身份运行,如果该用户/组不存在,则应创建它。
我不需要手动维护它们;它是一个服务帐户,其存在的唯一目的是由该容器运行。
是否可以仅使用 docker compose,而不使用任何其他文件来执行以下操作:
docker compose up
${SLUG}
是否是已知用户。如果没有,请在主机上创建它。${GROUP_SLUG}
是否是已知组;如果没有,请在主机上创建它。我不是在寻找:
docker compose up
总而言之,我正在寻找一种方法让 Docker 维护其容器的服务用户(AKA 帐户)。
这可能吗?
在您的 Compose 文件中,只需设置所需的用户和组 ID。 假设它们是数字,你可以设置
user: "${SLUG}:${GROUP_SLUG}"
并运行例如
#!/bin/bash
export SLUG="$RANDOM"
export GROUP_SLUG="$RANDOM"
docker-compose up -d
(其中,特别是在 GNU Bash 中,环境变量
$RANDOM
计算为 0 到 32767 之间的随机整数。)
无需以任何重要方式创建用户,无论是在主机上还是在容器中。
如果您只有一个用户和组名称,并且该用户和组已经存在于主机上,那么您可以在系统信息中查找它们。
user: "${UID}:${GID}"
export UID=$(id -u "$SLUG")
export GID=$(getent group "$GROUP_SLUG" | cut -d: -f3)
docker-compose up -d
只需设置
user:
通常就会达到您想要的效果:在容器中运行的单个进程将具有指定的用户 ID,这意味着该进程创建的任何文件都将归该用户所有(该用户可能不存在于容器中) /etc/passwd
在主机上或在容器中)。
可以构建一个镜像,这样就行不通了,并且您必须编辑 Dockerfile 来解决这些问题。 某些操作需要 root 访问权限,如果容器以非 root 用户身份运行,则这些操作将不起作用(您可以在 Dockerfile 中进行此设置吗?);我见过一些需要写回应用程序源代码树的设置,如果用户 ID 不匹配,这些设置就不起作用。 解决这些问题将针对图像和您遇到的问题。