我是否可以在没有bash脚本的情况下使用docker compose检查容器,然后将文件从容器复制到主机?
这是我正在尝试并行化的工作流:我是否可以在没有bash脚本的情况下使用docker compose检查容器,然后将文件从容器复制到主机?,docker,kubernetes,docker-compose,dockerfile,docker-swarm,Docker,Kubernetes,Docker Compose,Dockerfile,Docker Swarm,这是我正在尝试并行化的工作流: 码头工人建造 码头工人赛跑 docker inspect container->returns false docker cp容器:文件/主机/ 我想使用docker compose在一台主机上完成这项工作,然后稍后转换到Kubernetes,这样我就可以在多台主机上协调这项工作 我应该创建一个bash脚本并让它在Dockerfile中运行吗 我正在寻找一个社区认可的最佳实践解决方案。在单主机Docker land中,您可以尝试安排事情,以便Docker run完
我正在寻找一个社区认可的最佳实践解决方案。在单主机Docker land中,您可以尝试安排事情,以便
Docker run
完成您需要的一切。避免docker-inspect
(这会排除通常不感兴趣的低级诊断)和docker-cp
。根据构建方式的不同,您可以在Dockerfile中构建工件,并将其复制出来
docker build-t图像。
#用“猫”把它弄出来?
docker run--rm映像\
容器中的cat/app/file\#
>文件#通过容器的标准输出发送到主机
#使用卷将其导出?
docker run--rm-v$PWD:/host映像\
cp/app/file/host
根据您正在构建的内容,您可能会进一步扩展此功能,以在卷中传递输入和输出,因此映像只是一个工具链。对于最小Go应用程序,使用,例如:
#不要docker构建任何东西,而是使用工具链运行容器
docker run--rm\
-v$PWD:/app\
-w/应用程序\
戈兰:1.15\
go build-o_应用程序。/cmd/the_应用程序
在最后一次设置中,-w
工作目录是绑定安装的/app
目录,因此转到build-o.\u app
将写入主机
由于此设置更倾向于一次性容器(注意docker run--rm
选项),因此它与Compose不匹配,Compose通常需要长时间运行的服务器类型容器
这种设置也不能很好地转换为Kubernetes。Kubernetes并不擅长在容器之间或与集群外的系统共享文件。如果您碰巧有一个NFS服务器,您可以使用它,但没有本机选项;最容易得到的是不能在多个Kubernetes吊舱(容器)之间重用的
ReadWriteOnce
卷
原则上,您可以编写一个Kubernetes作业,只进行一次编译。它无法运行docker build
,因此“运行”步骤必须执行实际的构建。你不能将kubectl cp
这里更好的高级方法是查找或安装某种网络可访问的存储,特别是用于保存结果的存储(人工服务器;对象存储,如AWS S3)。将构建序列重写为一个“任务”,它获取输入和输出的位置并运行构建,而忽略本地文件系统。设置一个类似RabbitMQ的作业队列,并将任务注入队列。最后,将构建器worker作为Kubernetes部署运行;它将并行构建与部署中的副本数量一样多的东西:
。这可能是有希望的:每个节点运行作业很困难。假设这样做的目的是将文件部署到每个节点。我应该提到,我想从容器复制回主机的文件是在每个容器上运行的测试结果。使用卷并将结果推送到容器中将更容易映射到kubernetes。我最后只是创建了一个bash从docker compose调用脚本,但现在让gitlab ci运行docker compose是一个非常困难的问题。