docker - 使用 Jenkins-Pipelines 在现有 Docker 中运行命令
问题描述
我是 Jenkins-Groovy 的新手,并尝试在现有的 Docker-Container 中运行命令,然后再使用 Jenkins-Pipeline 设置一些环境变量。
现在使用的 bash 脚本(所以只需从命令行执行它)看起来像这样并且可以工作:
export LIB_ROOT=/usr/local/LIBS
export TMP_MAC_ADDRESS=b5:17:a3:28:55:ea
sudo docker run --rm -i -v "$LIB_ROOT":/usr/local/LIBS/from-host -v /home/sbuild/Dockerfiles/Sfiles/mnt:/home/sbuild/mount --mac-address="$TMP_MAC_ADDRESS" -t sbuild:current
之后,我想在 Docker-Container 中构建我的一些源(安装),使用如下:
python3 batchCompile.sh ../mount/src.zip
现在我一直在尝试在我的 Jenkins 中这样写:
node ('linux-slave') {
withEnv(['PATH=/usr/local/LIBS:/usr/local/MATLAB/from-host -v /home/sbuild/Dockerfiles/Sfiles/mnt:/home/sbuild/mount --mac-address=b5:17:a3:28:55:ea']) {
docker.image('sbuild').inside {
sh 'echo $PATH'
sh 'mvn --version'
}
}
sh 'echo $PATH'
}
然而,这只是失败并显示不透明的消息:
Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 71: Expected a symbol @ line 71, column 25.
docker.image('sbuild:current').inside {
^
1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
我无法弄清楚出了什么问题。所以我只是想进入 Docker 内部,看看我能从那里做什么。有了这个小脚本,我做了一些实验:
script{
docker.image('sbuild:current').inside{
sh 'touch asdf'
sh 'cd /home/sbuild/'
sh 'pwd'
}
然而,默认情况下,我只是在 Jeninks-Folder 中工作,并且这些命令实际上都没有在 Docker 内部调用。此外,容器似乎在任何时候都不会运行。
我如何编写代码来启动我配置的 Docker 并在里面使用命令?
外面有一些用于创建新 Docker 容器的文档,但我很难弄清楚如何理解该错误消息以及如何正确调试。
编辑1:Dockerfile:
FROM labs:R2018
# Avoid interaction
ENV DEBIAN_FRONTEND noninteractive
# Set user to root
USER root
# =========== Basic Configuration ======================================================
# Update the system
#RUN apt-get -y update \
# && apt-get install -y sudo build-essential git python python-dev \
# python-setuptools make g++ cmake gfortran ipython swig ant python-numpy \
# python-scipy python-matplotlib cython python-lxml python-nose python-jpype \
# libboost-dev jcc git subversion wget zlib1g-dev pkg-config clang
# Install system libs
# RUN apt-get install sudo
# ========== Install pip for managing python packages ==================================
RUN apt-get install -y python-pip python-lxml && pip install cython
# Install simulix dependencies
RUN apt-get install -y git
RUN apt-get install --assume-yes python
RUN apt-get install --assume-yes cmake
RUN apt-get install --assume-yes mingw-w64
# Add User
#RUN adduser --disabled-password --gecos '' docker
#RUN adduser docker sudo
#RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER build
# Install simulix
WORKDIR /home/sbuild
RUN git clone https://github.com/***.git
RUN mkdir mount
WORKDIR /home/sbuild/Sfiles
RUN pip install -r requirements.txt
解决方案
当我将 Docker 与 Jenkins Pipeline 一起使用时,我只需执行以下sh
步骤:
try {
stage('Start Docker') {
sh 'docker-compose up'
}
stage('Build project') {
sh 'docker-compose exec my_service make:build
}
} catch (Error e)
// Maybe do something
} finally {
sh 'docker-compose stop'
}
你想用 try/catch/finally 块包围你的阶段,以便在发生故障时始终停止 docker 容器。
推荐阅读
- javascript - 错误 RangeError:使用 setTimeout 时超出了最大调用堆栈大小
- javascript - HTML 表单提交弹出窗口
- angular - Angular 8 组件 html 上的指令问题
- macos - 通过拖动到 macOS 中的命令行应用程序来传递 C 参数
- google-cloud-datastore - GQL 中的 LENGTH 是什么
- linux - 在 for 循环中输出到不同文件期间使用 basename 函数
- asp.net - 如何在asp.net中的两侧之间移动数据
- java - 适用于 SNMP 和 PPTP 的最低 Android 版本
- react-native - 急速模块地图中不存在急速模块“nodemailer”
- python - Pandas 添加基于多个标准的评分列