Docker 不关心用户权限。为什么?
Docker does not care about user permissions. Why?
我有一个 docker 文件 userPermissionDenied.df
,这是它的内容:
FROM busybox:1.29
USER 1000:1000
ENTRYPOINT ["nc"]
CMD ["-l", "-p", "80", "0.0.0.0"]
我运行以下命令:
> docker image build -t fooimg -f userPermissionDenied.df .
> docker container run fooimg
现在我希望得到以下输出:
> nc: bind: Permission denied
但我根本没有得到任何输出:
容器刚刚挂起。为什么?
我正在通过 Docker in Action by Jeff Nickoloff
学习 Docker,这就是我从中获得用例的地方。
鉴于您是 运行 作为 non-root 用户的 nc
命令(由于 Dockerfile
中的 USER 1000:1000
指令),您可能当 nc
尝试绑定端口 80 时,预计会看到某种“权限被拒绝”错误。
在 Docker 的早期版本中,这正是会发生的情况,但是 a few years ago Docker was modified so that containers run with net.ipv4.ip_unprivileged_port_start=0
,这意味着不再有任何“特权端口”:任何 UID 都可以绑定任何端口。
您可以在容器内通过 运行 sysctl
查看此设置:
$ docker run -it --rm -u 1000:1000 alpine sysctl -a |grep net.ipv4.ip_unprivileged_port_start
net.ipv4.ip_unprivileged_port_start = 0
the container just hangs. Why?
容器没有“挂”;它成功 运行 nc -l -p 80
,正在等待连接到端口 80 上的容器。如果您要使用 curl
或其他工具连接到该容器中的端口 80,它会显示通过连接发送的任何数据,然后容器会在连接关闭时退出。
我有一个 docker 文件 userPermissionDenied.df
,这是它的内容:
FROM busybox:1.29
USER 1000:1000
ENTRYPOINT ["nc"]
CMD ["-l", "-p", "80", "0.0.0.0"]
我运行以下命令:
> docker image build -t fooimg -f userPermissionDenied.df .
> docker container run fooimg
现在我希望得到以下输出:
> nc: bind: Permission denied
但我根本没有得到任何输出:
容器刚刚挂起。为什么?
我正在通过 Docker in Action by Jeff Nickoloff
学习 Docker,这就是我从中获得用例的地方。
鉴于您是 运行 作为 non-root 用户的 nc
命令(由于 Dockerfile
中的 USER 1000:1000
指令),您可能当 nc
尝试绑定端口 80 时,预计会看到某种“权限被拒绝”错误。
在 Docker 的早期版本中,这正是会发生的情况,但是 a few years ago Docker was modified so that containers run with net.ipv4.ip_unprivileged_port_start=0
,这意味着不再有任何“特权端口”:任何 UID 都可以绑定任何端口。
您可以在容器内通过 运行 sysctl
查看此设置:
$ docker run -it --rm -u 1000:1000 alpine sysctl -a |grep net.ipv4.ip_unprivileged_port_start
net.ipv4.ip_unprivileged_port_start = 0
the container just hangs. Why?
容器没有“挂”;它成功 运行 nc -l -p 80
,正在等待连接到端口 80 上的容器。如果您要使用 curl
或其他工具连接到该容器中的端口 80,它会显示通过连接发送的任何数据,然后容器会在连接关闭时退出。