我的目标是使用 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 build
、docker import
和docker 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