我有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'.
我尝试了不同的方法来实现多线码头运行命令,但到目前为止还没有运气。
也许有人对此有一些想法?
答案 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