多行泊坞窗运行命令

时间:2017-10-17 17:43:40

标签: docker jenkins-pipeline

我有Jenkins管道:

    node('some_vm') {
        stage('Build'){

                sh '''\\
                docker run --name my_container --privileged -v /dev/vboxdrv:/dev/vboxdrv\\
                -v /usr/bin/vboxheadless:/usr/bin/vboxheadless\\
                -v /usr/bin/vboxmanage:/usr/bin/vboxmanage\\
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxguest/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxguest/\\
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxsf/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxsf/\\
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxvideo/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxvideo/\\ 
                -v /usr/lib/virtualbox/:/usr/lib/virtualbox/\\
                -v /etc/udev/rules.d/60-vboxdrv.rules:/etc/udev/rules.d/60-vboxdrv.rules\\ 
                -v /sbin/lsmod:/sbin/lsmod\\
                -v /sbin/modprobe:/sbin/modprobe\\ 
                -v /lib/x86_64-linux-gnu/libssl.so.1.0.0:/lib/x86_64-linux-gnu/libssl.so.1.0.0\\
                -v /lib/x86_64-linux-gnu/libcrypto.so.1.0.0:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0\\
                -v /usr/bin/vboxsdl:/usr/bin/vboxsdl\\
                -v /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0:/usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0\\
                -v /usr/lib/x86_64-linux-gnu/libcaca.so.0:/usr/lib/x86_64-linux-gnu/libcaca.so.0\\
                -v /lib/x86_64-linux-gnu/libslang.so.2:/lib/x86_64-linux-gnu/libslang.so.2\\
                -v /home/jenkins/workspace/test/:/config/\\
                -v /home/jenkins/workspace/test/vms:/root/VirtualBox\\ VMs/\\
                -e VAGRANT_1 -e VAGRANT_2 -e VAGRANT_3 test_image\\
                '''
        }
}

但总是失败并出现错误:

"docker run" requires at least 1 argument(s).
See 'docker run --help'.

我尝试了不同的方法来实现多线码头运行命令,但到目前为止还没有运气。

也许有人对此有一些想法?

2 个答案:

答案 0 :(得分:1)

这是一个简单的groovy脚本:

node {
    stage('check java') {
        sh "java -version "
    }
}

shellscript中的多行:

echo "hello-world" && \
    echo "foo-bar"

然后按“向上”箭头从历史记录中获取命令,它将显示;

echo "hello-world" && echo "foo-bar"

重写命令:

node('some_vm') {
        stage('Build'){

                sh "docker run --name my_container --privileged -v /dev/vboxdrv:/dev/vboxdrv \
                -v /usr/bin/vboxheadless:/usr/bin/vboxheadless \
                -v /usr/bin/vboxmanage:/usr/bin/vboxmanage \
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxguest/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxguest/ \
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxsf/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxsf/ \
                -v /lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxvideo/:/lib/modules/4.4.0-62-generic/kernel/ubuntu/vbox/vboxvideo/ \ 
                -v /usr/lib/virtualbox/:/usr/lib/virtualbox/ \
                -v /etc/udev/rules.d/60-vboxdrv.rules:/etc/udev/rules.d/60-vboxdrv.rules \ 
                -v /sbin/lsmod:/sbin/lsmod \
                -v /sbin/modprobe:/sbin/modprobe \ 
                -v /lib/x86_64-linux-gnu/libssl.so.1.0.0:/lib/x86_64-linux-gnu/libssl.so.1.0.0 \
                -v /lib/x86_64-linux-gnu/libcrypto.so.1.0.0:/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 \
                -v /usr/bin/vboxsdl:/usr/bin/vboxsdl \
                -v /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0:/usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0 \
                -v /usr/lib/x86_64-linux-gnu/libcaca.so.0:/usr/lib/x86_64-linux-gnu/libcaca.so.0 \
                -v /lib/x86_64-linux-gnu/libslang.so.2:/lib/x86_64-linux-gnu/libslang.so.2 \
                -v /home/jenkins/workspace/test/:/config/ \
                -v /home/jenkins/workspace/test/vms:/root/VirtualBox \
                -e VAGRANT_1 -e VAGRANT_2 -e VAGRANT_3 test_image"
        }
}

答案 1 :(得分:1)

通过在Dockerfile中使用JSON格式的CMD指令解决了这个问题。看起来容器中的bash有局限性,因此bash无法正常处理。我还决定引用Docker API而不是使用命令行项:https://jenkins.io/doc/book/pipeline/docker