如何在没有 root 权限的 Docker 容器中运行 TensorBoard?

Posted

技术标签:

【中文标题】如何在没有 root 权限的 Docker 容器中运行 TensorBoard?【英文标题】:How to run TensorBoard in Docker container without root privileges? 【发布时间】:2019-11-05 09:06:32 【问题描述】:

我在 Docker 容器中运行 tensorflow-gpu。 目前,当我使用 root 权限访问正在运行的 Docker 容器时,我只能运行和访问 TensorBoard。我想在不使用 root 权限的情况下完成此操作。这如何实现?

这里有一些关于我在做什么和结果如何的信息:

我正在使用 TensorFlow 提供的 docker 容器使用以下命令运行 tensorflow-gpu。

$ docker run \
-u $(id -u username):$(id -g username) \
-it --rm --runtime=nvidia \
-v $(realpath ~/data/workspace/notebooks):/tf/notebooks \
-v $(realpath ~/data/workspace/):/tf/workspace \
-v $(realpath ~/data/images/):/tf/images \
-p 8888:8888 -p 6007-6015:6007-6015 tensorflow/tensorflow:2.0.0a0-gpu-py3-jupyter

在启动容器的命令行中,我为 TensorBoard 添加了额外的端口。

我在执行以下操作时完成了运行 TensorBoard。

    容器正在运行(使用上述命令启动) → 每次尝试从正在运行的 Jupyter 笔记本中运行和访问 TensorBoard 都会失败 从 docker 主机 PC 我运行以下命令: $ docker ps获取容器名称 $ sudo docker exec -it <container name> bash → 我在有和没有sudo 的情况下都试过了,没有下面的命令将不起作用 tf-docker /tf > tensorboard --logdir <log directory> --port 6007 现在我可以通过localhost:6007 访问 TensorBoard

我是 Docker、TensorFlow 的新手,也是 Linux (Ubuntu) 的新手。 我想在不使用 root 权限的情况下完成我上面描述的事情。

有没有办法做到这一点? 最好/正确的方法是什么? 您的最佳实践建议是什么?

编辑 2019-06-24: 我不知道为什么它首先没有锻炼,也许我使用了错误的端口。这是我到现在为止的成就。

我使用以下命令行启动容器,其中我将 TensorBoard 的端口更改为 6006
$ docker run \
-u $(id -u username):$(id -g username) \
-it --rm --runtime=nvidia \
-v $(realpath ~/data/workspace/notebooks):/tf/notebooks \
-v $(realpath ~/data/workspace/):/tf/workspace \
-v $(realpath ~/data/images/):/tf/images \
-p 8888:8888 -p 6006:6006 tensorflow/tensorflow:2.0.0a0-gpu-py3- 
jupyter
然后从命令行我在 docker 容器内启动一个 bash shell,而不使用 root 权限:$ docker exec -it <container name> bash 之后,我启动 TensorBoard 并使用网页浏览器输出中的链接:tf-docker /tf > tensorboard --logdir <log directory> --port 6007 除了之前的命令,我还可以从 Jupyter notebook 启动 Tensorboard。
%reload_ext tensorboard.notebook
%tensorboard --logdir=<log directory> --port=6006

2019-10-09 编辑: 由于将 TensorFlow 2.0.0 版本与 TensorBoard 2.0.0 一起使用,我必须启动 TensorBoard:

$ tensorboard --logdir=<log directory> --host 0.0.0.0 --port 6006

如果不显式添加主机选项,它将不起作用。

【问题讨论】:

你试过直接在 notebook 中运行 Tensorboard:github.com/tensorflow/tensorboard/blob/master/docs/r2/…? 是的,我有。但由于我在没有 root 权限的情况下启动容器,所以我无法工作。 是的,我有。但我用%tensorboard --logdir="./log" --port 6007 尝试了%load_ext tensorboard.notebook(或%load_ext tensorboard.notebook),但我收到一条错误消息。在容器中以 root 权限运行 bash,然后启动 tensorboard,如我之前的帖子中所述,我能够在 Jupyter 笔记本中显示 TensorBoard。在笔记本中,我使用了来自您的链接%load_ext tensorboard 的命令。感谢那。但是有没有办法不使用 root 权限在 Docker 容器中运行 bash? 不幸的是,我无法使用链接https://github.com/tensorflow/tensorboard/blob/master/docs/r2/... 中的命令成功重现。但是我在没有 root 权限的情况下完成了在 docker 容器中启动 bash。现在使用命令 tf-docker /tf &gt; tensorboard --logdir &lt;log directory&gt; --port 6007 启动 TensorBoard 时,我可以使用地址 0.0.0.0:6007 从 Webbrower 与 TensorBoard 进行交互。 那么,如果不使用sudo,是不是不能在容器中运行bash,还是可以运行shell但不能运行TensorBoard?在任何一种情况下,你得到的错误是什么?我能想到的几件事:您必须将您的用户添加到docker 组(请参阅here)(不确定,因为您可以在没有sudo 的情况下执行docker run?);对日志目录或tensorboard 命令的权限在容器内仅限根用户。 【参考方案1】:

我遵循的步骤,我可以使用 tensorboard 可视化结果:

创建容器时,打开/映射 tensorboard 的外部端口:
> nvidia-docker run -d --name tkra_tensorb --ipc=host -it -p 8513:8090
> -p 3014:6006 -v /data:/data tkra_tb
在容器内,运行 tensorboard:
> tensorboard --logdir /data/tkra/MyDatasets/resnet101/checkpoints/
> --host 0.0.0.0 --port 6006

在我的浏览器中打开张量板::3014

【讨论】:

以上是关于如何在没有 root 权限的 Docker 容器中运行 TensorBoard?的主要内容,如果未能解决你的问题,请参考以下文章

k8s文件挂载权限分析

如何在 Docker 容器中使用 setfacl?

docker挂载volume的用户权限问题

nexus搭建docker镜像仓库

如何在 docker 中以非 root 用户身份写入卷容器?

docker user问题