15.5 Dockerfile
Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,每一条指令对应镜像中的一层。Dockerfile 分为基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令4部分,具体文件构成如下:
# 引入基础镜像 ubuntu
FROM ubuntu
# 添加维护者信息
LABLE user=tynam email=tynam.yang@gmail.com
# 复制当前目录下 run.sh 文件到镜像的根目录
ADD run.sh /
# 执行命令 ./run.sh
CMD ["./run.sh"]
下面对文件中的内容进行说明:
#:注释符。
FROM:指定基础镜像,并且必须是第一条指令。格式为FROM <image>或FROM <image>:<tag>或FROM <image>:<digest>。
LABLE:将数据添加到镜像中,格式为LABLE <key>=<value> <key>=<value>。
ADD:将文件复制到镜像中,格式为ADD <src> ... <dest>或ADD ["<src>",..."<dest>"]。
CMD:启动容器时默认要运行的程序,格式为CMD <command>或CMD ["executable","<param1>","<param2>"]或CMD ["<param1>","<param2>"]。
除了上面介绍的指令外,常用的指令还有如下几种:
COPY:复制文件,格式为COPY <src> ... <dest> 或COPY ["<src>",..."<dest>"]。与ADD指令不同的是,COPY只能是本地文件。
RUN:执行命令,格式为RUN <command>或RUN ["executable", "param1", "param2"]。
EXPOSE:声明端口,格式为EXPOSE <端口1> [<端口2>...]。
WORKDIR:指定工作目录,格式为WORKDIR <工作目录路径>。
创建测试用例脚本。新建一个test_dockerfile.py文件,添加两个测试用例test_01和test_02,其中test_01断言成功,test_02断言失败,代码如下:
# chapter15\test_dockerfile.py
import pytest
def get_student_info(student_id):
students = {
1001: {"name": "方鸿渐", "age": "21", "sex": "男"},
1004: {"name": "赵辛楣", "age": "16", "sex": "女"}
}
return students.get(student_id, "The student ID does not exist.")
def test_01():
student = get_student_info(1001)
assert student.get("name") == "方鸿渐"
def test_02():
student = get_student_info(1004)
assert student.get("name") == "方鸿渐"
if __name__ == "__main__":
pytest.main(["-s", "test_dockerfile.py"])
创建Dockerfile文件。在与test_dockerfile.py同文件夹下新建一个Dockerfile文件,添加内容如下:
# chapter15\Dockerfile
# 基于基础镜像
FROM python:3.10
# 设置 code 文件夹是工作目录
WORKDIR /code
# 将 test_dockerfile.py 文件添加到容器 /code 下
COPY test_dockerfile.py ?/code
# 更新 pip 库
RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
# 使用 pip 安装依赖库 pytest
RUN pip install pytest ?--index-url https://pypi.douban.com/simple
# 执行命令
CMD ["python", "test_dockerfile.py"]
首先设置基础镜像为Python3.10,然后设置工作目录为/code并将test_dockerfile.py文件添加到容器的工作目录中,接着升级pip库并安装脚本所需的pytest库,最后执行测试脚本test_dockerfile.py文件。
构建镜像。使用命令docker build -t testdockerfile . 生成镜像文件,参数-t后面添加镜像名称和tag,点(.)表示将生成的镜像保存到本地。命令运行完成后,通过命令docker images可看到镜像testdockerfile,如图15-19所示。
图15-19 构建镜像
创建容器并运行。使用命令docker run -it testdockerfile创建一个容器并运行,结果如图15-20所示,可以看到脚本test_dockerfile.py执行了两条测试用例,一条测试通过,另一条(test_02用例)测试失败。
图15-20 创建容器并运行
15.6 Docker部署Jenkins
Jenkins 是一款开源的持续集成工具,集成了开发生命周期的各个过程,包括构建、文档、测试、打包、模拟、部署、静态分析等,它可以帮助用户持续自动构建、测试软件项目,并监控一些定时执行的任务。Jenkins具有很多优势,例如易于安装、免费、可移植、丰富的插件库、可扩展性、分布式,同时支持在Docker下部署。本节将介绍在Docker下部署Jenkins和Jenkins在自动化测试中的应用。
15.6.1 Jenkins安装
Docker下安装Jenkins和其他应用程序的安装方式是相同的,首先获取镜像,然后启动容器,最后进入容器对应用程序进行初始化设置。详细操作步骤如下:
获取Jenkins镜像。在命令行工具中输入命令docker pull jenkins/jenkins获取Jenkins镜像的最新版本。
创建Jenkins容器。在命令行工具中输入命令docker run --name jenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home --restart always -d jenkins/jenkins,创建一个jenkins容器,如图15-21所示。
图15-21 创建Jenkins容器
命令中-v jenkins_home:/var/jenkins_home?是将容器/var/jenkins_home目录作为jenkins工作目录,并将本机硬盘上jenkins_home挂载到此位置,方便后续更新镜像后,继续使用原来的工作目录。
使用浏览器访问Jenkins页面。访问地址为http://{IP}:8080,如果是本机访问则可写成http://localhost:8080/。第一次访问需要对Jenkins进行初始化设置,首先输入管理员密码解锁Jenkins,如图15-22所示。
图15-22 访问Jenkins页面
获取管理员初始密码。Jenkins在第一次启动时会生成一个默认的管理员密码,使用命令docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword可查看,如图15-23所示。
图15-23 获取管理员初始密码
将得到的密码输入到图15-22所示的界面中,然后单击【继续】按钮,进入插件安装界面。
安装插件。插件安装时可以选择【安装推荐的插件】,也可以【选择插件安装】,如图15-24所示。“安装推荐的插件”即Jenkins会安装认为可用到的插件,“选择插件来安装”即指用户自定义插件的安装,可以一个插件也不安装,一般情况下选择【安装推荐的插件】。
图15-24 安装插件
创建管理员用户。插件安装完成后,进入创建管理员用户页面,如图15-25所示。根据要求输入用户名、密码、确认密码、全名、电子邮件地址,然后单击【保存并完成】按钮。
图15-25 创建管理员用户
配置Jenkins URL。管理员用户创建成功后,进入配置Jenkins URL页面,一般保持默认值即可,如图15-26所示。
图15-26 配置Jenkins URL
进入Jenkins主页。配置Jenkins URL完成后便完成了初始化的配置,进入Jenkins主页,界面如图15-27所示。
图15-27 Jenkins主页