在Jenkins容器中运行docker容器,如何从主机设置卷?

我正在使用“docker外的泊坞窗”与jenkins运行一个容器。 我的docker工作人员是:

--- 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的path。 我的意思是,当我运行docker-compose时

 volumes: - .:/app 

它被挂载在主机的 / var / jenkins_home / workspace / JOB_NAME中,但是我希望它被挂载在/ home / jj / jenkins / jenkins_home / workspace / JOB_NAME

任何想法做一个“干净”的模式?

PD:我使用环境variables做了一个解决方法。

主机上的Docker会根据请求映射path,docker-compose将使用它在容器内部看到的path发出请求。 这给你留下了一些select:

  1. 不要在你的版本中使用主机卷。 如果需要卷,则可以使用命名卷并使用docker io来读入和读出这些卷。 这看起来像: tar -cC data . | docker run -i --rm -v app-data:/target busybox /bin/sh -c "tar -xC /target" tar -cC data . | docker run -i --rm -v app-data:/target busybox /bin/sh -c "tar -xC /target" tar -cC data . | docker run -i --rm -v app-data:/target busybox /bin/sh -c "tar -xC /target" 。 您可以将docker / tar命令反转回来。

  2. 使主机上的path与容器的path匹配。 在你的主机上,如果你可以在var中创build一个符号链接,你可以在ln -s /home/jj/jenkins/jenkins_home /var/jenkins_home文件中更新你的ln -s /home/jj/jenkins/jenkins_home /var/jenkins_home文件以获得相同的path(你可能需要指定/ var / jenkins_home /。跟随符号链接)。

  3. 使容器的path与主机的path匹配。 这可能是最简单的select,但我不积极,它会工作(取决于撰写认为它正在运行的地方)。 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

如果简单选项不起作用,您可以从jenkins重build图像并更改JENKINS_HOMEvariables以匹配您的环境。

  1. 让你的写作path绝对。 你可以添加一些代码来设置一个variables: export CUR_DIR=$(pwd | sed 's#/var/jenkins_home#/home/jj/jenkins/jenkins_home#') 。 然后,您可以使用该variables设置音量:

volumes: - ${CUR_DIR:-.}:/app