【问题标题】:Running docker container in Jenkins container, How can I set the volume from host?在 Jenkins 容器中运行 docker 容器,如何从主机设置音量?
【发布时间】:2017-11-08 16:02:13
【问题描述】:

我正在使用“docker 之外的 docker”运行一个带有 jenkins 的容器。我的 docker compose 是:

---
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 container”启动的所有容器都在宿主机上运行。

但是当我尝试在需要卷的作业中在“jenkins 容器”中运行 docker-compose 时,它​​会从主机而不是 jenkins 获取路径。我的意思是,当我使用

运行 docker-compose
volumes:
  - .:/app

它安装在 host 中的 /var/jenkins_home/workspace/JOB_NAME 但我希望它安装在 /home/jj/jenkins/jenkins_home/workspace/JOB_NAME

有什么想法可以使用“干净”模式进行此操作吗?

P.D.:我使用环境变量做了一个解决方法。

【问题讨论】:

    标签: docker jenkins docker-compose


    【解决方案1】:

    主机上的 Docker 将映射来自请求的路径,并且 docker-compose 将使用它在容器内看到的路径发出请求。这给您留下了几个选择:

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

    2. 使主机上的路径与容器上的路径匹配。在您的主机上,如果您有权在 var 中创建符号链接,您可以 ln -s /home/jj/jenkins/jenkins_home /var/jenkins_home 然后更新您的 compose 文件以具有相同的路径(您可能需要指定 /var/jenkins_home/. 以遵循符号链接)。

    3. 使容器的路径与主机的路径匹配。这可能是最简单的选择,但我不肯定它会起作用(取决于 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

    如果简单选项不起作用,您可以重建 image from jenkins 并更改 JENKINS_HOME 变量以匹配您的环境。

    1. 使您的撰写路径成为绝对路径。您可以添加一些代码来设置变量: export CUR_DIR=$(pwd | sed 's#/var/jenkins_home#/home/jj/jenkins/jenkins_home#')。然后您可以使用该变量设置音量:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2021-10-25
      • 2022-06-15
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多