Docker 菜鸟视角--用 Dockerfile 构建测试环境 (镜像包括 python chrome 浏览器 解决中文乱码问题)

徐旻 · May 08, 2017 · Last by 白纸 replied at December 27, 2017 · 3583 hits

前一次我们通过docker 搭建了selenium的分布式测试环境。
在学习过程中,觉得如果把调试环境也放在docker,这样不管以后在工作中统一大家的调试的测试环境肯定会有帮助的。
刚开始我觉得只要我把我配置好的环境做成一个images 然后发给需要的人,让他们导入到docker中就可以了。
但是这个方法看起来很笨重,也不利于镜像的管理,如果镜像里修改了某些内容,难道还让我把新的镜像在发放一次?
答案是这个方法可行,但是还是笨重。
好在docker有自己的管理方式,就是dockerfile。
工作原理很简单,dockerfile中先指定一个基础镜像,然后把shell命令写到脚本中,然后脚本根据内容,在基础镜像的上开始运行脚本,最后就生成了新的镜像。
这种方式的好处就我现在能感受到的优点有:
1.方便传送,一个dockerfile基本上不会大于1M,但是一个docker image有的却会是几百M以上的。
2.方便维护,当我们的images中需要删除,或者增加什么工具或者控件的时候,我们修改dockerfile,然后发布出去,大家重新构建images就可以了。不需要去通知每个人去做操作,或者去每个人的images中去做相同的操作。

那么我们开始学习dockerfile。

目标:在镜像 selenium/standalone-chrome-debug 中添加python和中文字体。

1.问题

首先我们看下图

上图是我启动容器debug(使用的镜像selenium/standalone_chrome_debug),首先我们发现没有安装python,其次打开的网页中中文显示为乱码。我们就遇上了两个问题
问题1:安装python
问题2:增加字库

增加字库,解决方案

下图是@ycwdaaaa 在文章https://testerhome.com/topics/8450 中给出一个解决方案。他建议在dockerfile中加入以下命令

前面我说了dockerfile 中其实很大一部分就是执行shell命令。
那么我们来验证下,在容器debug的bash中输入命令
apt-get update
apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei
重新打开浏览器,发现中文乱码已经解决,不但问题解决了,还证明只要会shell命令,dockerfile的配置还是很简单的。

那我们开始编写dockfile然后构建我们需要的镜像。

FROM selenium/standalone-chrome-debug:3.4.0


USER root

RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean

我们来分析下这段dockfile的内容
1.FROM selenium/standalone-chrome-debug:3.4.0
从一个基础镜像开始建立我们的新镜像 这里把selenium/standalone-chrome-debug:3.4.0作为基础镜像

2.USER root
没有取查,估计意思是给root权限吧。

3.RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean
RUN 是dockerfile中的一个命令就是运行
然后先运行命令
apt-get update
看看apt-get的是否有更新
在运行命令
apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei
用apt-get 命令安装字库
最后运行命令
apt-get clean

那么来运行dockerfile来构建,输入命令
docker build -t debug/chinese .
这里我们要注意,好像运行docker build 的时候是自动寻找当前目录下的dockerfile,所以,我们先要进入到需要运行dockerfile的目录下才运行改命令。
如果build顺利,我们应该在images命令中找到新构建的镜像debug/chinese

然后我们启动该镜像

然后用vnc链接到容器内部。

打开chrome浏览区,输入百度的首页,我们就看到新构建的镜像启动出来的容器中的浏览器是没有中文乱码的困惑的。

Ps:注意,构建的时候一定要注意网络状态,我家网络太差了,构建的时候经常失败,构建了4个小时,才成功的。失败的时候,也会产生image,但是是没有repository名和tag名的,还会启动一个容器。我们需要先去杀掉容器,docker rm 命令,在删除构建失败的镜像 docker rmi 命令。

添加python系统,解决方案

通过字库的解决方案,我们了解到了dockerfile如何使用的。
让我现在写shell去安装不可能,作为一个有善于思考的伸手党。
我在github上找到了docker-python的dockerfile
https://github.com/docker-library/python/blob/db2d58d73043c85ceecc8e675372b4dc6a77d136/2.7/Dockerfile
我觉得只要把这个dockerfile中
FROM buildpack-deps:jessie修改为FROM selenium/standalone-chrome-debug:3.4.0
然后构建就应该成功。我现在就在构建中,无奈家中网络太差,一直构建到一半就失败。不过只要网络好,应该不会有问题的。

当然我们也可以做的细致点。把官方的dockerfile分解一下。
其实官方的dockerfile完成了3个内容。
1.安装python
2.安装PIP
3.安装virtualenv

还有一些安装依赖。
所以,我打算先做一个dockerfile,不安装pip,virtualenv,只安装python。然后构建成功的镜像在用新的dockerfile(chrome_debug + python) 去构建一个PIP的的镜像。

FROM selenium/standalone-chrome-debug:3.4.0

# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH

ENV LANG en_US.UTF-8

# runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
tcl \
tk \
&& rm -rf /var/lib/apt/lists/*


RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean

RUN apt-get update && apt-get install -y build-essential

ENV GPG_KEY C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF
ENV PYTHON_VERSION 2.7.13

RUN set -ex \
&& buildDeps=' \
tcl-dev \
tk-dev \
' \
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/* \
\
&& wget -O python.tar.xz "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz" \
&& wget -O python.tar.xz.asc "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz.asc" \
&& export GNUPGHOME="$(mktemp -d)" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \
&& gpg --batch --verify python.tar.xz.asc python.tar.xz \
&& rm -r "$GNUPGHOME" python.tar.xz.asc \
&& mkdir -p /usr/src/python \
&& tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \
&& rm python.tar.xz \
\
&& cd /usr/src/python \
&& ./configure \
--enable-shared \
--enable-unicode=ucs4 \
&& make -j "$(nproc)" \
&& make install \
&& ldconfig \
\
&& apt-get purge -y --auto-remove $buildDeps \
\
&& find /usr/local -depth \
\( \
\( -type d -a -name test -o -name tests \) \
-o \
\( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
\) -exec rm -rf '{}' + \
&& rm -rf /usr/src/python

这个dockerfile 其实就是把python的dockerfile拿过来然后把镜像源该成了
FROM selenium/standalone-chrome-debug:3.4.0

当中要注意两点
1.RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean
这段就是我们前面说的添加中文字体

2.RUN apt-get update && apt-get install -y build-essential
这句花了我一天的时间调查,如果没有这句,就会报错,看下图。

造成这个错误的原因就是selenium的镜像里没有装好gcc,但是python的镜像里是装好gcc的。
安装python本身没有问题,但是安装依赖缺失了。所以要在这里补这么一句。

然后运行dockerfile,等新的镜像做成,然后启动容器。

我们看到了带有python的可以显示中文的一个 调试环境。

总结

我们可以不会写shell,但是要会看的懂shell,简单的操作命令百度一下什么都有了。
当dockerfile 构建报错的时候,先去看logs,然后把报错的那句命令 拆分开(如果是多个命令在一起的比如很多时候apt-get的命令是用&&连接的。)去docker容器内调试看看。
尽量去找官方已经做好的dockerfile,然后微调一下。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

首先说一下USER这个指令哈。USER的意思是工作用户。 是说用哪个用户执行下面的命令。你的例子里面就是用root用户执行下面的命令,并且容器启动以后,entrypoint和CMD都是用root去执行的。 用docker exec命令进入容器的里面也是root用户。 如果换了另一个用户,例如work。 你再用docker exec命令进去容器的时候就会发现当前使用的用户是work了。类似的还有WORKDIR这个指令。意思是工作目录。

再说就是楼主说的镜像的共享的问题。楼主主要是通过dockerfile来达到镜像共享的问题。他人通过拿到你的dockerfile重新build一个镜像的方式来使用。其实我是十分不推荐这种做法的。 楼主可能觉得一个镜像比较大,传递起来比较麻烦耗时。 但是有些时候重新build一个镜像是更耗时的。尤其是这个镜像有好几层的时候。或者dockerfile里写了很多安装工具的shell,例如安装一个jdk就比较耗时。我这里有一个编译的基本镜像。从gcc到thrift到jdk到scala应有尽有,build这么个镜像没半个小时一个小时的是结束不了的。这时候反倒是拉现有的镜像比较快。 而且重新build一个镜像的话你是控制不了对方给这个镜像起什么名字,用什么tag的。非常的不好管理。 有时候会造成一个机器里同一个镜像有好多个名字和tag的情况。

所以我比较建议楼主在内网搭建一个镜像仓库。build好一个镜像以后直接push上去。 别人想用的话直接拉下来就好了。 不用你主动的发包给他。你只要维护好镜像仓库上的镜像版本就好了。有点像你在内网搭建了一个docker hub的感觉。 在以后测试环境变多,docker单节点扩展到多节点。 引入编排工具的时候,例如我用的k8s。 在多个节点之间共享镜像用的也同样是镜像仓库。 这类的容器编排工具都会提供image pull policy。通过你选择的策略去决定是否从镜像仓库中重新拉取最新的镜像。

楼主,我启动了中文的镜像,为什么显示中文还是乱码?

今天在家重新试过,用dokcerfile报错如下:

  Hash Sum mismatch
E: Failed to fetch http://211.162.127.22/files/4161000000808046/mirrors.163.com/debian/pool/main/f/fonts-wqy-microhei/fonts-wqy-microhei_0.2.0-beta-2_all.deb Hash Sum mismatch

E: Fetched 9,073 kB in 15s (580 kB/s)
Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
The command '/bin/sh -c apt-get update && apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei && apt-get cleani' returned a non-zero code: 100
root@default:/mnt/sda1/tmp#

我的dockerfile:

FROM selenium/standalone-chrome-debug:3.4.0

USER root

RUN apt-get update \
&& apt-get -y install ttf-wqy-microhei ttf-wqy-zenhei \
&& apt-get clean

家里长城宽带问题。。。

上次用你的方式被隔壁的人教育说用Shell脚本是错误的

@lunamagic 请问 vnc连接后,root 密码是什么

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up