Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署
<h3>写在前面</h3><p> Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上。为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2.0 的应用。当然笔者表示并不知道为什么ubuntu有这么多人青睐。接下来,笔者将从本片博文中,粗略的教大家怎么安装Docker 和 Jenkins 并且使用Visual Studio 2017 新建Demo 并实现自动部署</p>
<h3>环境准备</h3>
<p> 硬件配置: 1核1G 1M带宽。50G硬盘。</p>
<p> 系统环境:CentOS 7.3(64位)</p>
<p> 其实用的就是腾讯云</p>
<h3>安装Docker</h3>
<p> 其实安装Docker的过程,大家可以到Docker官网找到自己相对应的安装文档进行安装,Docker区分CE和EE的两个版本,具体这两个版本有什么区别,大家自行查阅相关资料,这里不再概述。教程用的是CE那么就找到对应的官方文档进行安装,以下是教程安装的步骤</p>
<p> </p>
<p> 1.更新一下包吧,多更无害</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"># sudo</span> <span style="color: rgba(0, 0, 255, 1)">yum</span> -y update</pre>
</div>
<p> </p>
<p> 2.安装所需的软件包 (其实这些腾讯云都具备了,只不过怕有些阉割版的系统缺少,所以贴上命令,安装过的使用该命令不会造成伤害)</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> -y <span style="color: rgba(0, 0, 255, 1)">yum</span>-<span style="color: rgba(0, 0, 0, 1)">utils \
device</span>-mapper-persistent-<span style="color: rgba(0, 0, 0, 1)">data \
lvm2</span></pre>
</div>
<p> </p>
<p>3.使用稳定版的仓库(当然可以使用最新版或测试版的仓库,这个需要官方的说明)</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">yum</span>-config-<span style="color: rgba(0, 0, 0, 1)">manager \
</span>--add-<span style="color: rgba(0, 0, 0, 1)">repo \
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">download.docker.com/linux/centos/docker-ce.repo</span></pre>
</div>
<p> </p>
<p>4.安装Docker ce </p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> docker-ce</pre>
</div>
<p>tips:在生产系统上,您应该安装特定版本的Docker CE,而不是始终使用最新版本。</p>
<p> </p>
<p>5.启动Docker</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">sudo</span> systemctl start docker</pre>
</div>
<p> </p>
<p>6.<span style="background-color: rgba(192, 192, 192, 1)"><code class="highlighter-rouge">docker</code></span><span><span>通过运行</span></span><span style="background-color: rgba(192, 192, 192, 1)"><code class="highlighter-rouge">hello-world</code></span><span><span> 映像</span><span>验证是否</span><span>正确安装</span><span>。</span></span></p>
<div class="cnblogs_code">
<pre># docker run hello-world</pre>
</div>
<p>如果出现以下的界面,就代表安装成功</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914181527672-668061510.jpg"></p>
<p> </p>
<h3>配置Docker加速器</h3>
<p> 此步骤不是必须的,前提是你的环境有梯子或者网速可以的,那么可以忽略这个步骤。</p>
<div class="cnblogs_code">
<pre>$ curl -sSL https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">get.daocloud.io/daotools/set_mirror.sh | sh -s </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://mirror.ccs.tencentyun.com</span></pre>
</div>
<p> 使用 <span style="background-color: rgba(192, 192, 192, 1)">https://mirror.ccs.tencentyun.com<span style="background-color: rgba(255, 255, 255, 1)"> 这个加速地址的前提是你必须要使用腾讯云,该地址外部无法访问,只有腾讯云才能使用此镜像地址。你可以使用DaoCloud加速地址,具体另行查阅相关资料。</span></span></p>
<p> </p>
<h3>安装Jenkins</h3>
<p><span style="background-color: rgba(192, 192, 192, 1)"><span style="background-color: rgba(255, 255, 255, 1)"> 首先不直接从Docker Store上直接Pull Jenkins 的 Image 文件,因为待会需要进行dotnet core 的 Docker自动部署,需要对宿主机上的Docker进行直接操作,那么需要挂载 Docker 给 Jenkins Image,所以现在需要自己动手编写 Dockerfile 构建自定义的Jenkins。</span></span></p>
<p><span style="background-color: rgba(192, 192, 192, 1)"><span style="background-color: rgba(255, 255, 255, 1)"> </span></span></p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">touch</span><span style="color: rgba(0, 0, 0, 1)"> Dockerfile
# vim Dockerfile</span></pre>
</div>
<p>插入以下内容:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">FROM jenkins:2.60.3
USER root
#清除了基础镜像设置的源,切换成腾讯云的jessie源
#使用非腾讯云环境的需要将 tencentyun 改为 aliyun
RUN </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">''</span> > /etc/apt/sources.list.d/jessie-<span style="color: rgba(0, 0, 0, 1)">backports.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian jessie main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> > /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list
#更新源并安装缺少的包
RUN apt</span>-get update && apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> -y libltdl7 && apt-<span style="color: rgba(0, 0, 0, 1)">get update
ARG dockerGid</span>=<span style="color: rgba(128, 0, 128, 1)">999</span><span style="color: rgba(0, 0, 0, 1)">
RUN </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">docker:x:${dockerGid}:jenkins</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/<span style="color: rgba(0, 0, 0, 1)">group
# 安装 docker</span>-<span style="color: rgba(0, 0, 0, 1)">compose 因为等下构建环境的需要
RUN curl </span>-L https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose</span>
<span style="color: rgba(0, 0, 0, 1)">
RUN </span><span style="color: rgba(0, 0, 255, 1)">chmod</span> +x /usr/local/bin/docker-compose</pre>
</div>
<p>如果不安装 libltdl7 会导致如下这个问题,原因是jenkins容器内部没有这个包</p>
<div class="cnblogs_code">
<pre>docker: error <span style="color: rgba(0, 0, 255, 1)">while</span> loading shared libraries: libltdl.so.<span style="color: rgba(128, 0, 128, 1)">7</span>: cannot open shared <span style="color: rgba(0, 0, 255, 1)">object</span> <span style="color: rgba(0, 0, 255, 1)">file</span>: No such <span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)"> or directory
Build step </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Execute shell</span><span style="color: rgba(128, 0, 0, 1)">'</span> marked build as failure</pre>
</div>
<p>在Jenkins操作宿主的Docker的时候会出现拒绝访问的问题,其实就是容器的jenkins用户没有权限访问容器外的docker命令,所以 <span style="background-color: rgba(192, 192, 192, 1)">RUN命令</span> 需要把Jenkins用户加入到Docker用户组</p>
<p> </p>
<p>构建Image</p>
<div class="cnblogs_code">
<pre># docker build . -t auto-jenkins</pre>
</div>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915001510641-1299806446.jpg"></p>
<p>出现以上 Successfully 内容代表安装Jenkins成功</p>
<p> </p>
<p>在启动Jenkins时,需要先创建一个Jenkins的配置目录,并且挂载到docker 里的Jenkins目录下</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /var/jenkins_home</pre>
</div>
<p>运行 Jenkins</p>
<div class="cnblogs_code">
<pre># docker run --name jenkins -p <span style="color: rgba(128, 0, 128, 1)">8080</span>:<span style="color: rgba(128, 0, 128, 1)">8080</span> -p <span style="color: rgba(128, 0, 128, 1)">50000</span>:<span style="color: rgba(128, 0, 128, 1)">50000</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-v /var/run/docker.sock:/var/run/<span style="color: rgba(0, 0, 0, 1)">docker.sock \
</span>-v $(<span style="color: rgba(0, 0, 255, 1)">which</span> docker):/bin/<span style="color: rgba(0, 0, 0, 1)">docker \
</span>-v /var/jenkins_home:/var/<span style="color: rgba(0, 0, 0, 1)">jenkins_home \
</span>-d auto-jenkins</pre>
</div>
<p> </p>
<p> 第一行:构建一个名称为jenkins的容器 -p 是容器运行开放端口</p>
<p> 第二行 和第三行: -v 是将宿主机的docker文件挂载进容器里</p>
<p> 第四行:建立宿主机的配置目录,挂载进docker容器里,这样容器里的Jenkins配置目录文件就会映射出来</p>
<p> 第五行:使用auto-jenkins Image 并且后台启动</p>
<p>这个时候 run Jenkins 会提示成功<img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914222730703-171222010.jpg"></p>
<p>执行 docker ps 命令后,发现什么都没有</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914222918782-495041679.jpg"></p>
<p>执行 docker ps -a 命令看看</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914223136985-515882056.jpg"></p>
<p> </p>
<p>执行 docker start -a jenkins 让容器前台输出运行信息的方式运行</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914223629375-2037921666.jpg"></p>
<p>不难看出其实 Jenkins 启动已经是可以了,只是权限问题导致这个错误的信息。</p>
<p> </p>
<p>现在需要看一下Jenkins官方的Dockerfile </p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914224230860-262976149.png"></p>
<p> 知道问题原因,贴上代码了。</p>
<div class="cnblogs_code">
<pre>##修改 /var/<span style="color: rgba(0, 0, 0, 1)">jenkins 文件夹权限
# </span><span style="color: rgba(0, 0, 255, 1)">chown</span> -R <span style="color: rgba(128, 0, 128, 1)">1000</span> /var/jenkins_home</pre>
</div>
<p> </p>
<p>继续执行运行Jenkins 代码</p>
<div class="cnblogs_code">
<pre># docker run --name jenkins -p <span style="color: rgba(128, 0, 128, 1)">8080</span>:<span style="color: rgba(128, 0, 128, 1)">8080</span> -p <span style="color: rgba(128, 0, 128, 1)">50000</span>:<span style="color: rgba(128, 0, 128, 1)">50000</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-v /var/run/docker.sock:/var/run/<span style="color: rgba(0, 0, 0, 1)">docker.sock \
</span>-v $(<span style="color: rgba(0, 0, 255, 1)">which</span> docker):/bin/<span style="color: rgba(0, 0, 0, 1)">docker \
</span>-v /var/jenkins_home:/var/<span style="color: rgba(0, 0, 0, 1)">jenkins_home \
</span>-d auto-jenkins</pre>
</div>
<p>这时你会看到悲催的信息</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914225411625-1516162533.jpg"></p>
<p>容器之前已经运行过了,所以会有一个容器已经存在了。哥来给你搽眼泪。执行以下命令,删除原本 run 出来的容器</p>
<div class="cnblogs_code">
<pre># docker <span style="color: rgba(0, 0, 255, 1)">rm</span> -f jenkins</pre>
</div>
<p> </p>
<p>删除完容器后,继续执行运行命令</p>
<div class="cnblogs_code">
<pre># docker run --name jenkins -p <span style="color: rgba(128, 0, 128, 1)">8080</span>:<span style="color: rgba(128, 0, 128, 1)">8080</span> -p <span style="color: rgba(128, 0, 128, 1)">50000</span>:<span style="color: rgba(128, 0, 128, 1)">50000</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-v /var/run/docker.sock:/var/run/<span style="color: rgba(0, 0, 0, 1)">docker.sock \
</span>-v $(<span style="color: rgba(0, 0, 255, 1)">which</span> docker):/bin/<span style="color: rgba(0, 0, 0, 1)">docker \
</span>-v /var/jenkins_home:/var/<span style="color: rgba(0, 0, 0, 1)">jenkins_home \
</span>-d auto-jenkins</pre>
</div>
<p>出现一串字符后,执行 docker ps 会发现容器已经启动了,正常了。这个时候是不是可以使用了?别着急,还有很长的路。<img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914230218172-563006510.jpg"></p>
<p> </p>
<h3>配置Jenkins</h3>
<p>打开浏览器输入地址 your IP:8080 进行访问,你会开心的看到这个界面,看到这个界面代表你的Jenkins 已经安装成功了,但是需要进行配置,现在就教大家怎么去配置</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914230430703-857518556.jpg"></p>
<p> </p>
<p>首先,进入容器内</p>
<div class="cnblogs_code">
<pre># docker exec -it jenkins /bin/bash</pre>
</div>
<p>查看 /var/jenkins_home/secrets/initialAdminPassword 文件内的密码</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">cat</span> /var/jenkins_home/secrets/initialAdminPassword</pre>
</div>
<p>其实不一定要进入容器内查看密码,可以直接在宿主机的环境下,查看 /var/jenkins//secrets/initialAdminPassword 的内容,因为之前笔者已经将这个目录挂载进Docker里面了</p>
<p> </p>
<p>复制输出的内容,粘贴到Administrator password,输入 exit 退出容器,此时进行下一步你会看到此界面,点击 Install suggested plugins</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914231632875-307037778.jpg"></p>
<p> </p>
<p>等待初始化完毕 </p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914232203453-1163993753.jpg"></p>
<p> </p>
<p>到了这一步,自己随缘去填吧。</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914232412641-107177696.jpg"></p>
<p> </p>
<p>使用VS2017创建一个ASP.NET Core 2.0 Web应用程序,并将代码上传到git。这里笔者就不演示上传代码的过程步骤了。</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914232733610-2063685969.jpg"></p>
<p>为你们准备了一个地址,方便你们完成本教程:http://git.oschina.net/wenalu/MvcTest</p>
<p> </p>
<p>新建一个自由风格的软件项目,并填名称 点击 OK</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914233119875-1113685672.jpg"></p>
<p> </p>
<p>填写源代码管理</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914233448922-2118660888.jpg"></p>
<p> </p>
<p>勾选 Poll SCM 设置拉取Git 上代码的间隔,笔者这里是两分钟拉取一次</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914233544110-1659931000.jpg"></p>
<p> </p>
<p>勾上 Delete workspace before build start 是设置构建前删除工作区</p>
<p>勾上 Abort the build if it's stuck 是设定构建的超时时间,如果构建使用的时间超过设定的时间,那么就认为这次的构建是失败的。笔者这里超时设置的是10分钟</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170914233717219-1930126168.jpg"></p>
<p> </p>
<p>增加一个Execute Shell 脚本,并填写以下脚本内容</p>
<div class="cnblogs_code">
<pre>#!/bin/<span style="color: rgba(0, 0, 0, 1)">bash
# 获取短版本号
GITHASH</span>=`git rev-parse --<span style="color: rgba(0, 0, 255, 1)">short</span><span style="color: rgba(0, 0, 0, 1)"> HEAD`
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> ---------------Remove-Orphans------------------<span style="color: rgba(0, 0, 0, 1)">
docker</span>-compose -f ./docker-compose.yml -f ./docker-compose.override.yml-p dockercompose4255153253317384266 down --rmi local --remove-<span style="color: rgba(0, 0, 0, 1)">orphans
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> ------------------Config-----------------------<span style="color: rgba(0, 0, 0, 1)">
docker</span>-compose -f ./docker-compose.ci.build.yml -<span style="color: rgba(0, 0, 0, 1)">p dockercompose4255153253317384266 config
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> ------------------Build------------------------<span style="color: rgba(0, 0, 0, 1)">
docker</span>-compose -f ./docker-compose.ci.build.yml -p dockercompose4255153253317384266 up --<span style="color: rgba(0, 0, 0, 1)">build
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> ---------------Publishing...------------------<span style="color: rgba(0, 0, 0, 1)">
docker</span>-compose -f <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./docker-compose.yml</span><span style="color: rgba(128, 0, 0, 1)">"</span> -f <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./docker-compose.override.yml</span><span style="color: rgba(128, 0, 0, 1)">"</span>-p dockercompose4255153253317384266 up -d --build</pre>
</div>
<p> <img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915115343360-281242554.jpg"></p>
<p>应用保存,回到项目界面上。点击立即构建进行部署工作 SUCCESS</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915093614766-969784778.jpg"></p>
<p> </p>
<p>打开浏览器,地址输入 your IP:8088/</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915093658360-394778452.jpg"></p>
<p> </p>
<h3>遇到的问题</h3>
<p> 其实上面的篇幅为了大家能尽快的实现部署,只是简要的介绍了途中一些常犯的错误。其实在搭建这个CI环境的时候遇到不止这些问题,比如说一开始的 Dockerfile 内容并不像教程中的一样。一开始是这样的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">FROM jenkins
USER root
#清除了基础镜像设置的源,切换成阿里云的jessie源
RUN </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">''</span> > /etc/apt/sources.list.d/jessie-<span style="color: rgba(0, 0, 0, 1)">backports.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian jessie main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> > /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian jessie-updates main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list \
</span>&& <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb http://mirrors.tencentyun.com/debian-security jessie/updates main contrib non-free</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/apt/<span style="color: rgba(0, 0, 0, 1)">sources.list
#更新源并安装缺少的包
RUN apt</span>-get update && apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> -y libltdl7 && apt-<span style="color: rgba(0, 0, 0, 1)">get update
ARG dockerGid</span>=<span style="color: rgba(128, 0, 128, 1)">999</span><span style="color: rgba(0, 0, 0, 1)">
RUN </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">docker:x:${dockerGid}:jenkins</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> /etc/<span style="color: rgba(0, 0, 0, 1)">group </span><span style="color: rgba(0, 0, 0, 1)">
USER jenkins</span></pre>
</div>
<p>当你如果在网上找到其他教程,教你如何安装jenkins,而你使用了类似于这个内容的Dockerfile,那么会在Jenkins构建编译的时候产生如下两个错误:</p>
<h4>第一:缺少 docker-compose </h4>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915094638532-2097957996.jpg"></p>
<p>出现这个状况,当然是可以解决的。首先进入容器,然后找到官方的安装docker-compose文档进行安装,jenkins使用的是Linux直接找到对应的Linux安装资料即可。</p>
<p> </p>
<h4>第二:权限问题</h4>
<p>从容器内手动安装 docker-compose 会出现无法安装的情况,原因是Jenkins 用户没有安装docker-compose 的权限</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915095200172-1826105014.jpg"></p>
<p>解决上述问题,当然可以切换 root 用户,但是笔者使用最笨最直接的方式,从构建镜像的时候就直接不使用 jenkins 用户,所以教程中并没有最后一句 USER jenkins 。这样做目的是让教程步骤更顺利</p>
<p><span style="color: rgba(255, 0, 0, 1)">tips:正式生产环境不建议直接切换到 root 用户运行</span></p>
<p> </p>
<p>运行 Jenkins 命令一开始是这样的:</p>
<div class="cnblogs_code">
<pre># docker run --name jenkins -p <span style="color: rgba(128, 0, 128, 1)">8080</span>:<span style="color: rgba(128, 0, 128, 1)">8080</span> -p <span style="color: rgba(128, 0, 128, 1)">50000</span>:<span style="color: rgba(128, 0, 128, 1)">50000</span><span style="color: rgba(0, 0, 0, 1)"> \
</span>-v /var/run/docker.sock:/var/run/<span style="color: rgba(0, 0, 0, 1)">docker.sock \
</span>-v $(<span style="color: rgba(0, 0, 255, 1)">which</span> docker):/bin/<span style="color: rgba(0, 0, 0, 1)">docker \
</span>-v /var/jenkins:/var/<span style="color: rgba(0, 0, 0, 1)">jenkins_home \
</span>-d auto-jenkins</pre>
</div>
<p>这样会造成构建的时候找到一个根本不存在的目录上</p>
<p><img src="http://images2017.cnblogs.com/blog/742352/201709/742352-20170915101007078-1476062539.jpg"></p>
<p>其实就是第三句 将/var/jenkins 改成 /var/jenkins_home 就解决这个问题了。</p>
<p>此时此刻,如果你曾经遇到过这样的问题,哥现在已经给你擦眼泪了。</p>
<p>当然这里不仅仅有这些问题的存在,只是有一部分在做这个教程的时候没有截图,就不再阐述了。</p>
<p> </p>
<h3>写在最后</h3>
<p> 其实笔者曾Google过这些教程,但是一无所获,发觉挺多人使用Ubuntu的,就是找不到一个Centos的案例。当然笔者也不知道他们为什么喜欢使用Ubuntu。这里把实施过程的心得分享给大家,是因为怕很多人跟笔者一样重滔覆辙,没有人帮助的日子挺惨的,也就算这么久以来为社区做些贡献吧。</p>
</div>
<div id="MySignature" role="contentinfo">
<blockquote>
<strong>程序员脱发交流群:488369393 欢迎加群交流</strong><br>
<strong>如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【<span style="font-size: 15pt; color: #ff0000">推荐</span>】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
</strong>
</blockquote>
<strong>
<div style="display: block; border: 2px solid #6ecaa8; padding: 10px; background: aliceblue">
<div>作者:Loongle </div>
<div>声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!</div>
</div>
</strong><br><br>
来源:https://www.cnblogs.com/LongJiangXie/p/7517909.html
頁:
[1]