将卷绑定到管道作业中的Docker容器

时间:2018-03-22 09:19:05

标签: docker jenkins jenkins-pipeline

所以,我有一个完全在Docker容器内构建的管道作业。使用的Docker镜像在构建之前从本地存储库中提取,并且几乎具有运行我的项目所需的所有依赖项。

问题是我需要一个选项来定义卷以将mound从Host绑定到容器,以便我可以使用Host系统上可用的工具执行某些分析,但不能在容器中执行。

有没有办法在Jenkinsfile(管道脚本)中执行此操作?

2 个答案:

答案 0 :(得分:0)

假设您在Linux下,请运行以下代码

docker run -it --rm -v /local_dir:/image_root_dir/mount_dir image_name

以下是一些细节: -it:交互式终端 --rm:退出容器后删除容器 -v:volume或者说将本地目录挂载到卷。

由于挂载功能将覆盖'在您的映像目录中,您应始终在映像根目录下创建一个新目录。

访问Use bind mounts以获取更多信息。

PS:

运行

sudo -s

在运行docker之前输入密码,这样可以节省大量时间,因为您不必在 docker 前面输入 sudo 你运行码头工作的时间。

ps2:

假设您的图像名称较长且图像ID为5ed6274db6ce,则可以至少运行前三位数或更多

docker run [options] 5ed

如果您有更多图像具有相同的前三位数,则可以使用四个或更多。 例如,您有以下两个图像

REPOSITORY                         IMAGE ID
My_Image_with_very_long_name       5ed6274db6ce
My_Image_with_very_long_name2      5edc819f315e

你可以简单地运行

docker run [options] 5ed6

运行图像My_Image_with_very_long_name。

答案 1 :(得分:0)

我不清楚这是不是你的意思。但如果不是。让我知道,我会试着弄清楚。

我对从主机到容器的安装的理解是将Jenkins工作区的内容安装在容器内。

例如在这个管道中:

pipeline {
    agent { node { label 'xxx' } }

    options {
        buildDiscarder(logRotator(numToKeepStr: '3', artifactNumToKeepStr: '1'))
    }

    stages {
        stage('add file') {
            steps {
                sh 'touch myfile.txt'
                sh 'ls'
            }
        }

        stage('Deploy') {
            agent {
                docker {
                    image 'lvthillo/aws-cli'
                    args '-v $WORKSPACE:/project'
                    reuseNode true
                }
            }
            steps {
                sh 'ls'
                sh 'aws --version'
            }
        }
    }

    post {
        always {
            cleanWs()
        }
    }
}

在第一阶段,我只是将一个文件添加到工作区。只是在詹金斯。 Docker没什么。

在第二阶段,我启动一个包含aws CLI的docker容器(这不是安装在我们的jenkins slave上)。我们将启动容器并将工作区安装在容器的/project文件夹中。现在我可以执行AWS CLI命令了,我可以访问文本文件。在下一个阶段(不在管道中),您可以在另一个容器或jenkins slave本身中再次使用该文件。

输出:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (add file)
[Pipeline] sh
[test] Running shell script
+ touch myfile.txt
[Pipeline] sh
[test] Running shell script
+ ls
myfile.txt
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] getContext
[Pipeline] sh
[test] Running shell script
+ docker inspect -f . lvthillo/aws-cli
.
[Pipeline] withDockerContainer
FJ Arch Slave 7 does not seem to be running inside a container
$ docker run -t -d -u 201:201 -v $WORKSPACE:/project -w ... lvthillo/aws-cli cat
$ docker top xx -eo pid,comm
[Pipeline] {
[Pipeline] sh
[test] Running shell script
+ ls
myfile.txt
[Pipeline] sh
[test] Running shell script
+ aws --version
aws-cli/1.14.57 Python/2.7.14 Linux/4.9.78-1-lts botocore/1.9.10

[Pipeline] }
$ docker stop --time=1 3652bf94e933cbc888def1eeaf89e1cf24554408f9e4421fabfd660012a53365
$ docker rm -f 3652bf94e933cbc888def1eeaf89e1cf24554408f9e4421fabfd660012a53365
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] cleanWs
[WS-CLEANUP] Deleting project workspace...[WS-CLEANUP] done
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

在您的情况下,您可以将数据装入容器中。执行这些操作,稍后您可以对jenkins slave本身的代码进行分析(无需docker)