我有一个创建了用户的dockerfile,因此它没有以root身份运行(最佳实践)
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
RUN groupadd -g 1001 appuser && useradd -r -u 1001 -g appuser appuser
USER appuser
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "ConsoleApp32.dll"]
我构建图像并运行容器:
docker build -f Dockerfile1 -t myappimage .
docker run -d --name myapp myappimage
然后检查它是否正在运行:
ps aux | grep dotnet
21569 1001 0:00 dotnet ConsoleApp32.dll
因此以uid 1001的身份运行。 然后,我检查该用户的主机:
cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
man
postmaster
cron
ftp
sshd
at
squid
xfs
games
postgres
cyrus
vpopmail
ntp
smmsp
guest
nobody
dockremap
没有appuser的迹象。我的理解(可能是错误的)是我们正在使用共享内核,并且用户应该在列表中。 我也查了uid
getent passwd 1001
未返回任何结果。 有人可以解释一下,因为我不了解进程如何在主机上以1001的uid的形式运行,并且没有关联的用户
答案 0 :(得分:0)
用户ID 与主机共享:它是1001。该用户的名称是通过在2.15.4
文件中查找而获得的。由于主机和容器具有不同的文件系统空间,因此它们具有不同的passwd文件。内核对用户名一无所知。
相应的常见问题解答:无论主机和容器中是否都有名为/etc/passwd
的用户,都没有关系;如果他们的数字用户ID不匹配,并且您使用的是Linux,并且您尝试与pat
共享内容,则一个用户将无法访问另一用户的文件。