如何让 docker 运行将目录从客户端计算机带到主机容器?



我的目标是使用 maven 编译一些代码,从我的 docker 客户端计算机上的项目目录中使用 docker。(mvn compile在 docker 容器中运行)。

假设我的 maven 映像称为mvn-image并且我的项目目录是project-dir

如果我让 docker 主机与 docker 客户端在同一台机器上运行 - 那么我可以使用类似于以下内容的内容挂载卷:

mvn -v /projects/project-dir:/workdir -i mvn-image mvn compile

但这是棘手的一点。我的 docker 客户端与主机位于不同的计算机上。我尽量不构建、推送和运行从我的项目目录构建的映像 - 我想要 docker 单行的便利。

我也知道我可以运行容器 - 并执行cp以将文件放入其中。但是有了这个,我仍然没有得到像使用 docker 复制挂载卷那样的单行代码。

我的问题是:**如何让 docker 运行将目录从客户端计算机带到主机容器?

发送本地数据并不是docker run的真正功能。其他命令如docker builddocker importdocker cp能够将本地数据从客户端发送到主机。 不过,docker run可以将标准发送到服务器。

码头工人构建

docker build实际上将在客户端指向的远程主机上运行。"构建上下文"被发送,然后一切都被远程运行。您甚至可以将 maven 构建作为构建的一部分运行:

FROM mvn-image
COPY . /workdir
RUN mvn compile
CMD ls /workdir

然后运行

docker build -t my-mvn-build .

您最终会在远程主机上获得一个映像,其中包含您的构建。没有本地构建/推送/远程构建步骤。

Docker run Stdio

docker run可以执行标准的Unix IO,因此将某些内容管道传输到容器中运行的命令中的工作方式如下:

tar -cf - . | docker run -i busybox sh -c 'tar -xvf -; ls -l /'

我不确定这将如何与您提供的用于运行容器的mvn命令一起使用,在普通的 Docker 客户端下,它将如下所示:

tar -cf - -C /projects/project-dir . | 
docker run mvn-image mvn compile sh -c 'tar -xvf - -C /workdir; mvn compile'

存储插件

否则,您可以以某种方式从客户端将数据装载到主机上。有 NFS 和 sshfs 存储插件。

同步

随着时间的推移,使用rsync或类似的东西将项目发送到 Docker 主机会更有效率。

码头工人 cp 脚本

不过,docker cp是一个相当简单的解决方案。如果你把它放在一个脚本中,但得到一个"一行"来运行。

#!/bin/sh
set -uex
cid=$(docker create mvn-image mvn compile)
docker cp /projects/project-dir $cid/workdir
docker start $cid
docker logs -f $cid

您必须使用 Docker Volume 插件来挂载共享/网络文件夹。

https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-shared-storage-volume-as-a-data-volume

相关内容

最新更新