本文为记录并讲解 通过参考 xtest 测试系统环境搭建教程,构建 Dockerfile 的过程。
xtest 环境搭建参照官方文档:http://xtest.readthedocs.io/zh/latest/src/local_install.html
正文
以下是完整的 Dockerfile
及注释,Dockerfile 完整项目可在 GitHub xtest-docker 查看。
FROM
根据基本环境部分可知,Docker 的基本镜像应选择 Ubuntu 14.04/16.04
版本。此处我选择 Ubuntu 16.04
,用语法 FROM
来指定 Docker hub 上已有的镜像。
FROM ubuntu:16.04
RUN
安装 Python3
的操作
- 在安装前先执行
apt-get update
是好习惯,该命令能保证当前使用的源是你修改后的,避免找不到安装包的情况。 - 语法
RUN
表示执行其后的 SHELL 代码。由于每个RUN
都是独立运行的,因此apt-get update
和后面安装的命令需要在一个RUN
中,避免 Docker 在构建过程中使用原有的缓存作为RUN apt-get update
的结果。 - 关于每个
RUN
独立运行,你可以这样理解: 假设你在第一个RUN
中执行cd xxx
, 第二个RUN
中执行ls
, 此时ls
输出的是xxx
上级目录的内容。
RUN apt-get update && \
apt-get install python3 python3-dev python3-pip -y
创建软链接,将 python
命令指向 python3
RUN ln -s /usr/bin/python3 /usr/bin/python
安装一些额外的必须的工具
RUN apt-get install -y wget xz-utils git
ENV
安装 NodeJS
使用 ENV
语法设置环境变量
格式有两种:ENV <key> <value>
或 ENV <key1>=<value1> <key2>=<value2>...
,选其一即可
ENV NODE_VERSION 8.10.0
参照官方文档[1],下载 nodejs
源码,解压并安装
RUN wget https://npm.taobao.org/mirrors/node/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz
RUN mkdir /usr/local/lib/nodejs
RUN tar -xJvf node-v$NODE_VERSION-linux-x64.tar.xz -C /usr/local/lib/nodejs && rm -rf /node-v$NODE_VERSION*
RUN mv /usr/local/lib/nodejs/node-v$NODE_VERSION-linux-x64 /usr/local/lib/nodejs/node-v$NODE_VERSION
将 nodejs
的安装路径添加到 PATH
中,方便后面执行 npm
命令
ENV PATH=/usr/local/lib/nodejs/node-v$NODE_VERSION/bin:$PATH
下载 xtest
前端源码到 /www
目录中
RUN mkdir /www && cd /www && git clone https://github.com/x-utest/xtest-web.git
COPY
COPY
操作将宿主机上的文件拷贝至容器中,用于编译。
还有个与 COPY
类似的命令 ADD
,推荐阅读博文[2]
COPY config.js /www/xtest-web/src/config.js
安装前端项目需要的工具,并编译
RUN cd /www/xtest-web && npm install && npm run build
后端依赖包的安装,不做赘述
RUN git clone https://github.com/our-dev/dtlib.git && \
cd dtlib && ./install.sh && rm -rf /dtlib
RUN git clone https://github.com/x-utest/xtest-server-base.git && \
cd xtest-server-base && ./install.sh && rm -rf /xtest-server-base
通过 pip install -f
安装依赖包
在此步,通过 pip3 install -r requirements.txt
, 在编写一个 Python 项目时都可以通过将依赖包写入 requirements.txt
中,方便其他人安装。
RUN git clone https://github.com/x-utest/xtest-server.git && \
cd xtest-server && pip3 install -r requirements.txt
Nginx
的安装
直接通过 apt
安装即可,方便之后用命令行启动 nginx 服务。
通过软链接,将 xtest-server
中提供的 nginx 配置文件添加到 /etc/nginx/conf.d/
目录中,此后重启 nginx 服务便自动监听请求并转发到 xtest 后端。
RUN apt-get install nginx -y
RUN cd /etc/nginx/conf.d/ && ln -s /xtest-server/nginx_config/* .
安装 MongoDB
- 安装过程参考官方教程[3]
- 原先是采用下载源码方式安装,但是在安装完成后发现
mongo
目录未添加到环境变量PATH
中,因此每次启动时会报Command not found
,尝试解决未果后换成通过apt
安装。希望有朋友知道解决方法的可以留言告知,感谢!
ENV MONGO_VERSION 3.2.7
RUN \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 && \
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list && \
apt-get update && \
apt-get install -y mongodb-org=$MONGO_VERSION \
mongodb-org-server=$MONGO_VERSION \
mongodb-org-shell=$MONGO_VERSION \
mongodb-org-mongos=$MONGO_VERSION \
mongodb-org-tools=$MONGO_VERSION && \
rm -rf /var/lib/apt/lists/*
将 mongodb.conf
文件拷贝至容器中,该文件写好后台运行等配置,启动 mongo 时需要指定该文件。
COPY mongodb.conf /data/mongodb.conf
将启动文件拷贝至容器,其中 init_mongo.sh
是初始化数据库脚本, start.sh
则是在初始化后的启动脚本,包括启动 mongo
和 启动 xtest-server
等操作。
COPY start.sh /data/start.sh
COPY init_mongo.sh /data/init_mongo.sh
VOLUME
通过 VOLUME
指令创建挂载点。这种方式创建的挂载点可以与其他容器共享数据,具体可参考博文[4]
VOLUME ["/data/db"]
WORKDIR
通过 WORKDIR
指令设置默认工作目录为 /data
, 每次进入容器可以发现默认路径已经是 /data
。
WORKDIR /data
CMD
通过 CMD
指令设置启动容器时默认执行的命令。
推荐阅读[5] RUN vs CMD vs ENTRYPOINT
CMD ["./start.sh"]
EXPOSE
EXPOSE
指令设置了容器启动时对外开放的端口号,若宿主机通过 -p xxx:xxx
参数启动容器映射端口号,可以方便地接收转发的消息。
EXPOSE 8009 8099
参考
[1]NodeJS 安装教程
[2]Dockerfile 指令 ADD 和 COPY介绍 - 51kata - 博客园
[3]Install MongoDB Community Edition on Ubuntu
[4]Dockerfile 指令 VOLUME 介绍 - 51kata - 博客园
[5]RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术
网友评论