我的目标是使用 docker 在我的 docker 客户端机器上使用我的项目目录中的 maven 编译一些代码。 (mvn compile
在 docker 容器中运行)。
假设我的 maven 镜像名为 mvn-image
,我的项目目录为 project-dir
。
如果我让 docker 主机与 docker 客户端在同一台机器上运行 - 那么我可以安装一个类似于以下内容的卷:
mvn -v /projects/project-dir:/workdir -i mvn-image mvn compile
但这是棘手的一点。我的 docker 客户端与主机位于不同的机器上。我试图不构建、推送和运行从我的项目目录构建的图像——我想要 docker one-liner 的便利。
我也知道我可以运行容器 - 并执行 cp
以获取其中的文件。但是我仍然没有得到我想要的 docker-copy 安装卷的单行。
我的问题是:**如何让 docker run 将目录从客户端机器带到主机容器? **
最佳答案
发送本地数据并不是 docker run
的真正功能。其他命令,如 docker build
, docker import
和 docker cp
能够将本地数据从客户端发送到主机。 docker run
虽然可以将标准输入发送到服务器。
Docker 构建
docker build
实际上会在您的客户端指向的远程主机上运行。 “构建上下文”被发送过来,然后一切都在远程运行。您甚至可以将 Maven 构建作为构建的一部分运行:
FROM mvn-image
COPY . /workdir
RUN mvn compile
CMD ls /workdir
然后运行
docker build -t my-mvn-build .
您最终会在远程主机上获得一个图像,其中包含您的构建。没有本地构建/推送/远程构建步骤。
Docker 运行标准
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 主机的东西随着时间的推移会更有效率。
Docker cp脚本
不过,docker cp
是一个相当简单的解决方案。如果您将其放入脚本中,则需要运行一个“one liner”。
#!/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
关于linux - 如何让 docker run 将目录从客户端机器带到主机容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42873775/