如何让docker运行把客户端机器的目录拿到宿主机容器中?
How to get docker run to take the directory from the client machine to the host container?
我的目标是使用 docker 在我的 docker 客户端计算机上使用我的项目目录中的 maven 编译一些代码。 (mvn compile
运行 宁在 docker 容器中)。
假设我的 maven 镜像名为 mvn-image
并且我的项目目录是 project-dir
.
如果我有 docker 主机 运行ning 在与 docker 客户端相同的机器上 - 那么我可以安装一个类似于以下内容的卷:
mvn -v /projects/project-dir:/workdir -i mvn-image mvn compile
但这是棘手的一点。我的 docker 客户端与主机在不同的机器上。我试图不构建和推送和 运行 从我的项目目录构建的图像 - 我想要 docker 单行的便利。
我也知道我可以 运行 容器 - 然后 cp
将文件放入其中。但是这样一来,我仍然没有得到我想要的 docker-copy 装载卷的单行。
我的问题是:**如何获取docker 运行从客户端机器到宿主容器的目录? **
您必须使用 Docker 卷插件来装载共享/网络文件夹。
发送本地数据并不是 docker run
的真正功能。 docker build
, docker import
and docker cp
are able to send local data across from client to host. docker run
等其他命令可以将标准输入发送到服务器。
Docker 建造
A docker build
实际上会 运行 在您的客户端指向的远程主机上。 "build context" 被发送过来,然后所有内容都是 运行 远程。您甚至可以 运行 Maven 构建作为构建的一部分:
FROM mvn-image
COPY . /workdir
RUN mvn compile
CMD ls /workdir
然后运行
docker build -t my-mvn-build .
您最终在远程主机上得到了一个图像,其中包含您的构建。没有 local-build/push/remote-build 个步骤。
Docker 运行 标准
docker run
可以执行标准的 Unix IO,因此将某些内容通过管道输送到容器中的命令 运行ning 中的工作方式如下:
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 and sshfs 个存储插件。
Rsync
使用 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
我的目标是使用 docker 在我的 docker 客户端计算机上使用我的项目目录中的 maven 编译一些代码。 (mvn compile
运行 宁在 docker 容器中)。
假设我的 maven 镜像名为 mvn-image
并且我的项目目录是 project-dir
.
如果我有 docker 主机 运行ning 在与 docker 客户端相同的机器上 - 那么我可以安装一个类似于以下内容的卷:
mvn -v /projects/project-dir:/workdir -i mvn-image mvn compile
但这是棘手的一点。我的 docker 客户端与主机在不同的机器上。我试图不构建和推送和 运行 从我的项目目录构建的图像 - 我想要 docker 单行的便利。
我也知道我可以 运行 容器 - 然后 cp
将文件放入其中。但是这样一来,我仍然没有得到我想要的 docker-copy 装载卷的单行。
我的问题是:**如何获取docker 运行从客户端机器到宿主容器的目录? **
您必须使用 Docker 卷插件来装载共享/网络文件夹。
发送本地数据并不是 docker run
的真正功能。 docker build
, docker import
and docker cp
are able to send local data across from client to host. docker run
等其他命令可以将标准输入发送到服务器。
Docker 建造
A docker build
实际上会 运行 在您的客户端指向的远程主机上。 "build context" 被发送过来,然后所有内容都是 运行 远程。您甚至可以 运行 Maven 构建作为构建的一部分:
FROM mvn-image
COPY . /workdir
RUN mvn compile
CMD ls /workdir
然后运行
docker build -t my-mvn-build .
您最终在远程主机上得到了一个图像,其中包含您的构建。没有 local-build/push/remote-build 个步骤。
Docker 运行 标准
docker run
可以执行标准的 Unix IO,因此将某些内容通过管道输送到容器中的命令 运行ning 中的工作方式如下:
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 and sshfs 个存储插件。
Rsync
使用 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