Docker 在容器中运行应用的主机上打开/编辑/保存

Docker 在容器中运行应用的主机上打开/编辑/保存,docker,Docker,我们最近在为客户机部署Linux版本的应用程序时遇到了很多问题(更新的库、缺少的库、安装路径),我们希望使用Docker进行部署 我们的应用程序是一个用户界面,因此我们自然会使用 -e DISPLAY:$DISPLAY -v /tmp/X11-unix:/tmp/X11-unix 我们可以看到用户界面弹出 但到了打开文件的时候,问题就从这里开始了。我们只想浏览主机系统并在主机上保存任何输出文件(输出目录由打开文件的位置确定) 你对此有何建议 我们希望客户端不会看到本地运行的应用程序与Docke

我们最近在为客户机部署Linux版本的应用程序时遇到了很多问题(更新的库、缺少的库、安装路径),我们希望使用Docker进行部署

我们的应用程序是一个用户界面,因此我们自然会使用

-e DISPLAY:$DISPLAY -v /tmp/X11-unix:/tmp/X11-unix
我们可以看到用户界面弹出

但到了打开文件的时候,问题就从这里开始了。我们只想浏览主机系统并在主机上保存任何输出文件(输出目录由打开文件的位置确定)

你对此有何建议


我们希望客户端不会看到本地运行的应用程序与Docker内部运行的应用程序之间的差异。我们正在编写一个启动脚本,这样客户端看起来仍然会双击它来启动应用程序。我们可以在其中添加docker run命令所需的所有配置。

您可能知道,容器有自己的文件系统,该文件系统由运行在其顶部的映像提供

您可以将主机的目录或文件映射到容器内的路径,即程序所期望的路径。这称为docker卷。您已经使用X11套接字通信(
-v
标志)完成了这项工作

例如,对于文件:

docker run -v /absolute/path/in/the/host/some.file:/path/inside/container/some.file
对于目录:

docker run -v /absolute/path/in/the/host/some/dir:/path/inside/container/some/dir
您可以根据需要提供任意数量的
-v
标志


您可以找到更多有用的信息。

根据@CFrei和@Robert的建议,这里有一个似乎很有效的解决方案:

docker run                                \
       -ti                                \
       -u $(id -u):$(id -g)               \
       -v /home/$(id -un):/home/$(id -un) \
       -v /etc/passwd:/etc/passwd         \
       -w $(pwd)                          \
       MyDockerImage
现在,在该容器中创建的每个文件都完全位于主机上的正确目录中,并由用户拥有所有权

从容器内部看,它真的很像主机,这对客户端非常有用

再次感谢你们的帮助


我希望这可以帮助其他人。

我正在考虑将容器启动的位置映射到容器内的目录。但我不确定当客户端选择要打开的文件时,这是否适用于“打开”对话框窗口。如果他上一个目录,他就回到容器里了。我正在考虑映射“-v/:/mnt/host”,希望他不会返回超过该点。但是像这样让容器完全访问是有风险的,乍一看似乎是有风险的。但是,这与直接在主机上安装应用程序有什么不同呢?您可以以特定用户名运行容器应用程序。(但是,是的,这听起来很危险)请记住,默认情况下容器以root运行。因此,创建的所有文件都具有根访问权限(仅限)。您可以使用
docker run
-u…
更改用户。您可能还希望包括
-v/etc/passwd:/etc/passwd`以便在容器中包含您的用户名。