Docker 容器和主机中的不同文件所有者

Different file owner inside Docker container and in host machine

我遇到了与 Docker 用户相关的问题。 我 运行 我的容器作为 gitlab-runner 使用以下命令:

docker run --name testes_cashlink --hostname testes_cashlink --user gitlab-runner --privileged -t -v $DIR_TESTES:/cashlink_host -v $DIR_BATS:/bats -v $DIR_PROJETO:/cashlink_war docker-cashlink-ci /bats/run.sh

在 docker 容器中创建的文件显示所有者 gitlab-runner,但是,相同的文件在我的主机中显示为所有者 roggerfernandesgitlab-runner 必须是在 Docker 容器和主机中创建的文件的所有者。

文件系统,至少在 Unix 和 Linux 类系统(包括 macOS)中,文件所有者是一个数字,而不是一个名字。 ls 等各种工具会为了方便将数字翻译成名称,但它仍然只是一个数字。您在容器中的用户 gitlab-runner 和主机系统中的用户 roggerfernandes 具有相同的 UID。您可以通过 运行ning id 命令找到数字 ID。

在我的笔记本电脑上(为了便于阅读,重新格式化了一下):

$ id
uid=501(dan) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),
  79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),501(access_bpf),
  33(_appstore),100(_lpoperator),204(_developer),395(com.apple.access_ftp),
  398(com.apple.access_screensharing),399(com.apple.access_ssh)

这里你看开头我的UID是501

您也可以 运行 使用用户名执行此命令,例如id gitlab-runner 容器内。

docker exec testes_cashlink id gitlab-runner

所以当容器中的用户拥有一个文件时,它被存储为一个数字 ID(很可能是 1000,一个常见的默认值)。当您查看主机系统时,将数字转换为用户名的机制在其结果中的用户名与您在容器内看到的用户名不同。

如果您需要容器内的特定用户 ID,则需要修改 Dockerfile,以便在创建用户时指定其 uid。例如:

RUN useradd -u 1005 <other options> gitlab-runner