linux - 如何让 docker run 将目录从客户端机器带到主机容器?

标签 linux docker containers host mount

我的目标是使用 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 importdocker 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'

存储插件

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

同步

使用 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/

相关文章:

c - 如何从可执行文件中查找源文件名?

azure - 来自守护进程 : Get https://azure/v2/: dial tcp: lookup azure: no such host 的错误响应

asp.net - 如何在 docker swarm 模式负载均衡器中托管 Asp.net 应用程序

testing - 如何使用 arquillian 进行具有多个 maven 模块的集成测试

docker - 使用容器docker作为CF应用程序的代理来获取公共(public)IP

php - 如何在 Linux Fedora 上的 Apache 中启用 PHP?

linux - 无法在 Linux 上启动 Archiva v2.1.0 - java.lang.UnsupportedClassVersionError

c - 具有巨大局部变量的堆栈溢出?

docker - channel 创建失败。 GRPC超时

C++:对 map 的引用