一、在Docker容器中执行apt install安装报错(13: Permission denied)
在UBUNTU服务器中启动了一些docker容器,但容器中缺少很多命令,比如vim就没有,于是执行apt install vim,但报错E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
etherpad@52ab2c3f5da8:/opt/etherpad-lite$ apt-get update
Reading package lists... Done
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied).
很明显是用户权限问题,于是加入有万金油之称的privileged选项,使用--privileged=true参数配置,container内的root拥有真正的root权限,否则container内的root只是外部的一个普通用户权限,但即使这样依然报错。
最后使用docker -u root指定用户(指定和当前宿主机一样的用户运行容器)解决问题。可能针对使用docker run -v有目录挂载的情况,需要采用这种方式来规避出现 permission denied。如果不是root,可以在宿主机里创建和容器默认一样的用户,然后把要映射的文件目录使用chown -R user:group方式修改为docker里的用户。另外此问题也许和服务器的SELinux安全机制有关联,有条件可以试试关闭sentenforce。
二、使用docker安装jenkins代码持续发布:Jenkins from v2.60.3 to v2.164.3 or later
之前搭建过多次jenkins平台,不过还没有使用docker搭建过,但相信这一定是一个更方便办法。因为我爱docker。在docker中搜索jenkins,可以看到已经有官方的镜像包了。热度非常高。使用docker pull拉取镜像安装过程记录如下:
root@med-1:/# docker search jenkins
NAME DESCRIPTION
jenkins Official Jenkins Docker image 4959
jenkins/jenkins The leading open source automation server 2275
...
root@med-1:/# docker pull jenkins
Using default tag: latest
Status: Downloaded newer image for jenkins:latest
docker.io/library/jenkins:latest
root@med-1:/# mkdir /opt/jenkins_data
#添加发布专用用户并指定密码用于发布
root@med-1: /#useradd -d /home/jenkins -m -s /bin/bash jenkins
root@med-1: passwd jenkins
......
#启动jenkins
root@med-1:~# docker run -d -p 8080:8080 --name jenkins -u root -v /opt/jenkins_data:/var/jenkins_home jenkins
启动成功后能正常访问8080页面,但在加载安装插件时全都报错,调用docker查看日志发现报错为 Caused by: java.io.IOException: Matrix Project Plugin v1.18 failed to load. - You must update Jenkins from v2.60.3 to v2.164.3 or later to run this plugin。提示jenkins版本太低,需要更新。看来docker中的jenkins版本好久没有更新了。可以直接进入容器中 /usr/local/jenkins 目录,下载官方镜像最新版jenkins,替换容器中原有的/usr/local/jenkins/jenkins.war。也可以在容器外下载传入容器内。
#进入docker容器中
cd /usr/local/jenkins
wget http://mirrors.jenkins.io/war/latest/jenkins.war
再次进入即解决You must update Jenkins from v2.60.3 to v2.164.3 or later to run this plugin。问题,更新后我这里的版本是Jenkins 2.265版本。期间在容器中碰到不少问题,比如Cant find any collection named fabfile fab: not found。根本没有fab环境。可以参见: jenkins代码发布平台No module...named fabfile、Jenkins提示Access Denied没有全部Read权限问题及python版本导致ImportError_jenkins error 403 no valid crumb was included in t-CSDN博客 不过这里是需要在容器中安装pip来安装fab,同时容器中的默认python版本是2.7,我这里最后都直接下载安装,希望容器中的python版本也赶紧升级,看提示在2021.1.1.之后就不会再支持了。安装过程记录如下:
#缺少setuptools模块,下载安装
ImportError: No module named setuptools
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py install
#安装pip模块
wget https://files.pythonhosted.org/packages/08/25/f204a6138dade2f6757b4ae99bc3994aac28a5602c97ddb2a35e0e22fbc4/pip-20.1.1.tar.gz
tar zxvf pip-20.1.1.tar.gz
cd pip-20.1.1
python setup.py install
#docker容器自带python2.7后续问题
root@bc2290456599:~# pip install fabric==1.14.0
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip,can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
三、docker下安装jenkins出现Found invalid crumb问题
使用docker安装的jenkins,然后将jenkins.war包更新到了最新版(2.265)解决了docker中版本过老的提示问题,但在使用最新版的时候,开始还都挺好的,但突然执行任务保存时发现保存不了,从个人判断是JS执行问题,甚至浏览器中还有报JS跨域错误:The Cross-Origin-Opener-Policy header has been ignored, because the origin was untrustworthy. It was defined either in the final response or a redirect. Please deliver the response using the HTTPS protocol. You can also use the 'localhost' origin instead. 查看容器中的错误日志,报:2020-11-09 09:55:24.938+0000 [id=21] WARNING hudson.security.csrf.CrumbFilter#doFilter: Found invalid crumb 354bb484547d84f65767e559be774acb6f1f3a3a88d2ac02d8279e11623b17d7. If you are calling this URL with a script, please use the API Token instead. More information: https://jenkins.io/redirect/crumb-cannot-be-used-for-script
错误关键词:Found invalid crumb 。和CSRF验证有关联,有说使用Strict Crumb Issue插件来解决。进入Jenkins插件管理,Available选项,搜索Strict Crumb插件安装Strict Crumb Issuer插件,然后进入jenkins->系统设置->全局安全设置->跨站请求伪造保护,把下拉选项改成Strict Crumb Issue,点开右下高级设置,去除掉Check the session ID选项选中。但我这里这样操作之后仍然不行。
无奈再次进入jenkins下载索引页面:http://mirrors.jenkins.io/war/ 下载了2.187/这个版本。因为有说从2.189之后才碰到了这个问题。但切换版本之后碰到了一堆插件版本不兼容问题,jenkins列出一列要降级的插件版本,我全部选中进行安装,但在安装过程中出现了错误,导致整个jenkins成了僵尸了。浏览器报错,服务也没有任何反应。最后我再版本切换回最新版2.265,神奇地又能使用了!先这样保存一版日志,后续再用。
另外使用docker搭建pythonWeb服务,用的tiangolo/uvicorn-gunicorn-fastapi镜像,安装后fastapi的目录在 /usr/local/lib/python3.8/site-packages/fastapi。如果需要修改静态文件的位置,docker容器下就进入容器这个目录下的 openapi/docs.py 里修改,本CSDN博客中已经有相关的文章。