docker - Jenkins 无法在具有特定运行参数的声明性管道中启动 docker 代理容器
问题描述
我有下一个设置:
- 一个亚马逊 EC2 实例;
- Jenkins安装在上面;
- 与 Jenkins 一起安装的 Docker 实例;
- Docker 实例在 Jenkins 上配置为云;
- docker 代理模板也被配置,并且可以在管道通过代理部分的标签调用它时使用。
我想要完成的是在 Jenkins 管道中使用 docker 容器作为主要代理。现在这个代理需要运行一些构建步骤并保持运行,直到其他构建计划停止运行的容器并清理它们。这是管道脚本:
pipeline {
agent {
docker {
image 'localhost:5000/build_deploy_agent:base'
label 'build-deploy-agent'
args '--network bridge -p 9102:9102'
}
}
stages {
stage('Example Build') {
steps {
sh 'ps aux'
}
}
}
}
发生的情况是:Jenkins 启动了容器,但它不能用于从舞台上运行脚本。我收到三个像这样的错误:
docker inspect -f . localhost:5000/build_deploy_agent:base
/home/jenkins/workspace/view name/Build plan name@tmp/durable-9a8a9027/script.sh: 1:
/home/jenkins/workspace/view name/Build plan name@tmp/durable-9a8a9027/script.sh: docker: not found
我肯定在这里做错了什么,但我一无所知。
更新 1
- 使用的基础 docker 镜像是来自 docker hub 的“jenkins/agent”镜像。
- 下面我使用 docker 代理设置添加图像:
解决方案
TL;博士
正在运行的服务器jenkins
需要docker-ce-cli
并且运行服务器的用户jenkins
应该在docker
组中(如果不运行为root
)。
此示例使用docker
编排的所有内容docker-compose
。
.
├── docker-compose.yaml
├── Dockerfile
├── etc
│ └── nginx
│ └── conf.d
│ └── default.conf
└── plugins.txt
该docker-compose
规范运行由以下代理的 jenkins 服务器nginx
:
version: '3.7'
services:
nginx:
image: 'nginx:1.19'
container_name: 'nginx'
restart: 'always'
depends_on:
- 'jenkins'
ports:
- '80:80'
volumes:
- 'jenkins:/var/jenkins_home'
- './etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf'
jenkins:
build:
context: '.'
container_name: 'jenkins'
privileged: true
restart: 'always'
expose:
- '50000'
- '8080'
volumes:
- 'jenkins:/var/jenkins_home'
- '/var/run/docker.sock:/var/run/docker.sock'
volumes:
jenkins:
注意: home 是在服务器和服务jenkins
之间共享的。nginx
jenkins
userContent
注意:jenkins
服务共享docker
主机的套接字。
nginx.conf
从 doc稍作修改:
upstream jenkins {
keepalive 32;
server jenkins:8080 max_fails=3;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen *:80;
listen [::]:80;
server_name _;
charset utf-8;
ignore_invalid_headers off;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
}
location /userContent {
root /var/jenkins_home/;
if (!-f $request_filename){
rewrite (.*) /$1 last;
break;
}
sendfile on;
}
location / {
sendfile off;
proxy_pass http://jenkins;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header Connection "";
}
}
jenkins
扩展图像docker
并将jenkins
用户添加到ping
组中(组 ID 是主机上999
的组ID)。: docker
_Dockerfile
FROM docker:20.10.5-dind as docker
FROM jenkins/jenkins:alpine
USER root
COPY --from=docker /usr/local/bin/docker /usr/local/bin/docker
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/plugins.txt
RUN adduser jenkins ping
USER jenkins
注意:图像是使用默认建议插件以及Docker和Docker Pipelinejenkins
插件预先烘焙的。: _plugins.txt
github:1.33.1
pipeline-model-api:1.8.4
scm-api:2.6.4
mailer:1.32.1
workflow-support:3.8
font-awesome-api:5.15.2-2
pipeline-milestone-step:1.3.2
git:4.6.0
plain-credentials:1.7
resource-disposer:0.15
jackson2-api:2.12.1
jquery3-api:3.5.1-3
gradle:1.36
credentials:2.3.15
docker-workflow:1.26
workflow-scm-step:2.12
display-url-api:2.3.4
bootstrap4-api:4.6.0-2
antisamy-markup-formatter:2.1
command-launcher:1.5
pipeline-stage-tags-metadata:1.8.4
snakeyaml-api:1.27.0
pipeline-stage-view:2.19
script-security:1.76
okhttp-api:3.14.9
pipeline-stage-step:2.5
workflow-step-api:2.23
timestamper:1.11.8
pipeline-github-lib:1.0
token-macro:2.13
pam-auth:1.6
workflow-cps-global-lib:2.18
ws-cleanup:0.39
pipeline-model-definition:1.8.4
workflow-aggregator:2.6
jsch:0.1.55.2
matrix-auth:2.6.5
ssh-credentials:1.18.1
ant:1.11
jjwt-api:0.11.2-9.c8b45b8bb173
momentjs:1.1.1
trilead-api:1.0.13
durable-task:1.35
workflow-job:2.40
git-server:1.9
ssh-slaves:1.31.5
plugin-util-api:2.0.0
git-client:3.6.0
lockable-resources:2.10
checks-api:1.5.0
pipeline-input-step:2.12
cloudbees-folder:6.15
pipeline-build-step:2.13
popper-api:1.16.1-2
pipeline-graph-analysis:1.10
matrix-project:1.18
workflow-api:2.41
github-branch-source:2.9.7
workflow-basic-steps:2.23
apache-httpcomponents-client-4-api:4.5.13-1.0
workflow-multibranch:2.22
workflow-cps:2.90
ldap:1.26
build-timeout:1.20
echarts-api:5.0.1-1
pipeline-model-extensions:1.8.4
structs:1.22
junit:1.48
docker-java-api:3.1.5.2
docker-plugin:1.2.2
workflow-durable-task-step:2.38
credentials-binding:1.24
jdk-tool:1.5
bouncycastle-api:2.20
docker-commons:1.17
github-api:1.123
authentication-tokens:1.4
email-ext:2.82
branch-api:2.6.2
pipeline-rest-api:2.19
ace-editor:1.1
handlebars:1.1.1
您可以使用docker-compose
ie:调出环境docker-compose up -d
。服务器启动后,您可以通过jenkins
http://localhost 访问服务器。
基本jenkins
管道:
pipeline {
agent {
docker {
image 'ubuntu:20.04'
}
}
stages {
stage('Test') {
steps {
sh 'ps -axf'
}
}
}
}
注意:不使用任何标签或模板(与问题无关)。这docker run
是从jenkins
主机完成的。
推荐阅读
- r - 在 qwraps2 中使用 summary_table 时出错。不正确的data.frame?
- javascript - JavaScript - Puppeteer 超时等于零意义和行为
- python - 如何收缩 NetworkX 中只有 2 条边的节点?
- docker - 在 dockerfile 中创建的卷未安装在容器中
- c# - 如何让“switch”-“break”代码执行后继续工作?
- react-native - 我可以在我的 React Native 应用程序中使用 JQuery 和 BootStrap 等 JavaScript 库吗
- hadoop - org.apache.kylin.job.exception.ExecuteException:java.lang.NoClassDefFoundError:org/apache/hadoop/hive/serde2/typeinfo/TypeInfo
- tomcat - 为什么 WsSessionListener.sessionCreated() 在嵌入 tomcat 9 中发出“AbstractMethodError”?
- javascript - 查询模型时返回未定义
- typescript - 开玩笑 - 测试一个函数是否调用了另一个函数