我正在使用"码头工程师在码头工人和#34;之外运行一个带jenkins的容器。我的码头组成是:
---
version: '2'
services:
jenkins-master:
build:
context: .
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/urandom:/dev/random
- /home/jj/jenkins/jenkins_home/:/var/jenkins_home
ports:
- "8080:8080"
所以所有容器都是从" jenkins容器"正在主机上运行。
但是当我尝试在" jenkins容器"中运行docker-compose时在需要卷的作业中,它从主机而不是jenkins获取路径。我的意思是,当我用
运行docker-compose时volumes:
- .:/app
它安装在主机的/ var / jenkins_home / workspace / JOB_NAME中,但我希望它挂载在/ home / jj / jenkins / jenkins_home / workspace / JOB_NAME
使用" clean"做任何想法。模式?
P.D。:我使用环境变量做了一个解决方法。
答案 0 :(得分:1)
主机上的Docker将按照请求映射路径,而docker-compose将使用它在容器内看到的路径发出请求。这为您提供了一些选择:
不要在构建中使用主机卷。如果需要卷,可以使用命名卷并使用docker io读入和读出这些卷。那看起来像是:
tar -cC data . | docker run -i --rm -v app-data:/target busybox /bin/sh -c "tar -xC /target"
。你可以反转docker / tar命令来取回数据。
使主机上的路径与容器的路径匹配。在您的主机上,如果您有权在var中创建符号链接,则可以ln -s /home/jj/jenkins/jenkins_home /var/jenkins_home
然后更新您的撰写文件以使其具有相同的路径(您可能需要指定/ var / jenkins_home /。以遵循符号链接)
使容器的路径与主机的路径匹配。这可能是最简单的选择,但我不肯定它会起作用(取决于compose认为它正在运行的地方)。您的jenkins master的Dockerfile可以包含以下内容:
RUN mkdir -p /home/jj/jenkins \
&& ln -s /var/jenkins_home /home/jj/jenkins/jenkins_home
ENV JENKINS_HOME /home/jj/jenkins/jenkins_home
如果easy选项不起作用,您可以重建image from jenkins并更改JENKINS_HOME变量以匹配您的环境。
export CUR_DIR=$(pwd | sed 's#/var/jenkins_home#/home/jj/jenkins/jenkins_home#')
。然后,您可以使用该变量设置音量: volumes:
- ${CUR_DIR:-.}:/app