一般我们在Linux下执行某些外部程序的时候可能会提示不到共享库的错误, 比如:

tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directorylinux系统安装步骤csdn

原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可. 

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径不到该共享库文件. 

所以安装共享库后要注意共享库路径设置问题, 如下:

1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令


ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/f内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表. 

2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/f中, 如下:

cat /etc/f
include f.d/*.conf
echo "/usr/local/lib" >> /etc/f
# ldconfig
Dockerfile
FROM jenkins:latest
USER root
RUN apt-get update
RUN apt-get install -y sudo
RUN rm -rf /var/lib/apt/lists/*
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
ADD libltdl.so.7 /usr/lib/x86_64-linux-gnu/libltdl.so.7
USER Jenkins
缺失文件所在目录 /usr/lib/x86_64-linux-gnu/libltdl.so.7
docker run -d -p 9000:8080 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /usr/java/jdk/jdk1.8.0_131:/usr/java/jdk1.8.0_
131 -v /usr/java/tomcat/apache-tomcat-8.5.16:/usr/tomcat/apache-tomcat-8.5.16 -v /usr/java/maven/apache-maven-3.5.0:/usr/maven/apache-maven-3.5.0 zss/jenkins:1.0
/usr/java/tomcat/apache-tomcat-8.5.16/webapps/ROOT
/usr/java/jdk/jdk1.8.0_131
构建触发器指定了触发一次构建的条件。推荐使用最简单的配置“Poll SCM”,它的意思是,定时检查版本库,发现有新的提交就触发构建。这种方式对git、SVN等所有版本管理系统都是通用的。
我们在日程表中填入:
* * * * *
表示每分钟检查一次。如果你觉得太频繁,可以改成“每3分钟检查一次”:
*/3 * * * *
原来的部署方式
原来我用的部署方案是这样的:
在主机上安装Jenkins,然后在Jenkins的任务中运行Docker命令,在主机里部署应用。
基本逻辑如下:
Jenkins任务通过git更新代码
运行docker build,从最新的代码中生成一个image
用docker run运行这个image完成一个应用实例的部署
相对来说还是挺简单的。
但是这次整的一个新的服务器,我实在不想再安装Jenkins了,你们懂的,Java应用的安装都是很麻烦的。就打算pull一个Jenkins的image来放docker里跑。那么问题来了:如何让一个跑在Container里的Jenkins把应用部署到host环境上?总不能在container里创建新的container吧。
解决方案
解决方案就是fabric,本质上是ssh。
方法如下:
build一个Jenkins image,在其中加入fabric
运行这个container的时候加入host机
在fabfile.py里加入一个role为host机用户
在fabfile.py用这个用户运行部署脚本
在Jenkins任务里调用这个fabric部署脚本
参考如下Jenkins Dockerfile,用的基础image是alpine版,这个比较小。
repositories里放的是国内镜像源,比原配的源快很多。
这个Dockerfile主要做的事情就是安装fabric。
FROM jenkins:alpine
MAINTAINER raptor<raptor.zh@gmail>
USER root
COPY repositories /etc/apk/
RUN apk update && apk add tzdata \
&&cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& ( echo "Asia/Shanghai"> /etc/timezone ) \
&& apk add python py-pip py-paramiko \
&& pip install --upgrade pip -i pypi.doubanio/simple \
&& pip install fabric -i pypi.doubanio/simple
USER jenkins
用如下命令构建并启动Jenkins container,注意其中加入了dockerhost主机:
docker build -t myjenkins .
docker run -d -p 127.0.0.1:8080:8080 -v /var/lib/jenkins:/var/jenkins_home --add-host=dockerhost:`/sbin/ip route | /usr/bin/awk '/docker0/ { print $NF }'`--name=jenkins myjenkins
另外,jenkins_home被映射到了host上的/var/lib/jenkins,这样的话就可以在jenkins任务中把部署代码checkout到这里。
比如:
cd /var/jenkins_home
git checkout git@github:yourname/yourproject.git
为了能够登录代码仓库pull代码以及登录host进行部署,需要在/var/lib/jenkins/.ssh里创建ssh key。并且把公钥配置到代码仓库的部署公钥和host的jenkins用户的authorized_keys。
然后SSH到host里运行部署脚本,把这里的代码部署到一个新的image里,再启动成一个container。一个部署任务的fabfile例子如下:
from fabric.api import *
ledefs={
'jenkins': ['jenkins@dockerhost']
}
@roles('jenkins')
def deploy_app():
with cd('/var/lib/jenkins/yourproject'):
        run('docker build -t yourimage .')
        run('docker run -d --name yourproject yourimage') 6
这里就是在host机上以jenkins用户运行docker的build/run构建项目image并启动项目container。
需要注意的是,在Jenkins container里,jenkins用户的UID是1000,所以host机上也应该创建一个UID为1000的jenkins用户,否则可能会有访问权限上的问题。当然,把二者都指定一个其它的ID会更好。
另外,host里的这个jenkins用户必须能够通过SSH登录(如果你在sshd_config里限制了只能部分用户登录的情况),而且如前面所说,应该配置ssh key登录,即,把Jenkins container里的jenkins用户的公钥添加到host的jenkins用户的authorized_keys里。
网址 blog.csdn/raptor/article/details/72027036

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。