一、 创建dockerfile文件
# 创建目录
mkdir jenkinsci_dockerfile
# 进入目录
cd jenkinsci_dockerfile
# 创建dockerfile文件
touch dockerfile
二、 将依赖的文件或目录和安装包放在当前目录
# 将容器里python3编译文件拷贝到宿主机dockerfile同级目录下
docker cp 容器名:python3编译文件 ./
# 在当前目录下创建allure数据文件目录,用于存放allure文件夹
mkdir allure_data
# 将容器里allure文件拷贝到宿主机allure_data目录下(这里有坑,见第七点,这里的操作已修正)
docker cp allure:./allure_data目录下
# 创建环境配置文件
touch env_path
最终目录结构:
三、 编写dockerfile文件
vim dockerfile
# 基础镜像
FROM jenkins/jenkins:lts
# 拷贝python3安装编译包到镜像,编译步骤见前面搭建容器的文章
COPY ./python3 /var/jenkins_home/
# 切换到root用户,保证接下来的操作有权限
USER root
# 添加软连接
RUN ln -s /var/jenkins_home/python3/bin/python3.7 /usr/bin/python3\
&&ln -s /var/jenkins_home/python3/bin/pip3 /usr/bin/pip3\
&&ln -s /var/jenkins_home/python3/bin/pytest /usr/bin/pytest
# 复制allure到镜像
COPY ./allure_data /home/data/
# 配置allure环境变量
COPY ./env_path /var/jenkins_home
RUN cat /var/jenkins_home/env_path >> /root/.bashrc && /bin/bash -c "source /root/.bashrc"
四、 构建镜像
docker build -f dockerfile -t jenkinsci:1 .
最后的点不要忘记,这里的上下文路径是当前目录
五、 创建运行容器,验证镜像功能
# 创建运行容器
docker run -id --name=jenkinsci1 -p 8080:8080 -v /var/jenkins_node:/var/jenkins_home jenkinsci:1
# 进入容器
docker exec -it -uroot jenkinsci1 /bin/bash
验证jenkins功能:
在浏览器访问ip地址:8080端口,如果能进入jenkins页面,说明没问题
验证python3环境:
验证pytest:
验证allure:
六、上传镜像到dockerhub
以上验证无误说明定制镜像没问题,可以上传到远程镜像仓库
1、首先注册dockerhub账号,地址:dockerhub官网地址
2、本地登录远程仓库:docker login ,根据提示输入用户名密码
3、为本地镜像打标签:docker tag 本地镜像名:tag dockerhub用户名/远程镜像名:tag
可以看到本地多一个拷贝出来的镜像,名字就是远程镜像名,将这个镜像push到远程镜像仓库
4、本地docker push dockerhub用户名/远程镜像名:tag
push完成可以在dockerhub上看到镜像名
七、出现的问题和解决过程
1、问题:
根据定制的镜像创建运行容器,进入容器验证环境时,发现python3、pytest都验证通过,但是allure --version提示找不到allure
2、解决过程:
1、查找allure环境变量是否通过dockerfile命令生效,cat /root/.bashrc,发现有allure环境变量
2、看allure文件夹是否通过COPY命令拷贝到环境变量对应的路径下。发现/home/data目录下没有allure文件夹,只有四个文件夹(后面发现是allure目录下的四个文件夹)
3、然后去查看COPY命令,发现写法似乎没什么问题,但是没拷贝成功,问题肯定是出在COPY命令上,于是去搜索COPY命令具体用法,找到答案如果源路径是目录,那么会将源路径目录下的内容拷贝到镜像里,所以需要修改jenkinsci_dockerfile下allure的位置,创建一个目录allure_data,将allure放在子目录allure_data下,dockerfile COPY alure_data,拷贝到镜像的是allure,经过验证,allure --version正常
3、总结:
COPY命令:
格式:COPY 宿主机文件或目录 镜像目录/
如果源路径是个文件,则把文件拷贝到镜像目录下
如果源路径是个目录,则把目录下的内容拷贝到镜像目录下
注意:目录路径最好在结尾加上/,代表是目录
dockerfile依赖文件或目录存放位置:
一般放在dockerfile文件同级目录下即可
如果要做COPY命令,依赖的文件放在同级目录下,依赖的文件夹放在同级目录
的子目录下