1.先简单介绍环境变量相关知识,${VARIABLE:-VALUE}和${VARIABLE:+VALUE}。

${VARIABLE:-VALUE}表示当VARIABLE为空时,显示VALUE,当VARIABLE为非空时,显示其值。

${VARIABLE:+VALUE}表示当VARIABLE为非空时,显示VALUE,当VARIABLE为空时,显示其值。

dockerfile 字符串拼接 docker编排文件_centos

2.编辑Dockerfile文件,注意首字母必须大写。非注释(没有#)第一行必须时FROM指明基础镜像。MAINTAINER指明维护者信息,也可以用LABER指明(这里我们注释掉,供参考),另外增加一个COPY操作。形成一个简单的编排。通过docker build执行编排。-t参数给编排完的镜像打上标签。./指明创建到当前目录。起一个tinyweb1容器执行cat指令进行验证,跟--rm参数会在指令结束后自动关闭容器。

dockerfile 字符串拼接 docker编排文件_linux_02

dockerfile 字符串拼接 docker编排文件_dockerfile 字符串拼接_03

3.将/etc/yum.repos.d/目录复制到/root/img1目录(变为当前目录)下,重新编排Dockerfile,将当前目录中yum.repos.d目录下的文件,复制到镜像文件/etc/yum.repos.d目录下,在Dockerfile中src(源)只用指明目录,系统会自动选择下面的问价,类似于DIR/*,dest(目标)一定要写明目录,即最后要加上/,否则会出现识别问题。编排完成用新镜像后跑tinyweb1测试,发现文件已经全部复制过去。

dockerfile 字符串拼接 docker编排文件_dockerfile 字符串拼接_04

dockerfile 字符串拼接 docker编排文件_dockerfile_05

dockerfile 字符串拼接 docker编排文件_dockerfile_06

4.还可以通过ADD将网络压缩文件下载到容器,这里一定要记得指明下载保存的目录路径,系统是没有默认保存路径的。编排完成后生成镜像tinyhttpd:v0.1-3。起容器进行测试,发现压缩包已经下载到容器下的指定路径。

dockerfile 字符串拼接 docker编排文件_centos_07

dockerfile 字符串拼接 docker编排文件_dockerfile_08

5.这里我们将压缩包下载到当前目录,修改编排,将压缩包ADD到指定目录。系统会将其解压到指定目录下。用新编排创建镜像,用镜像起容器,然后验证指定目录下的情况。

dockerfile 字符串拼接 docker编排文件_centos_09

dockerfile 字符串拼接 docker编排文件_docker_10

6.再次编写编排文件。WORKDIR增加工作目录,VOLUME指明宿主机上挂载目录。创建镜像,然后用镜像起容器。在容器中mount查看挂载地址。

dockerfile 字符串拼接 docker编排文件_dockerfile 字符串拼接_11

dockerfile 字符串拼接 docker编排文件_centos_12

7.再次编写编排文件,通过EXPOSE指明暴露的端口80。创建镜像,用镜像起容器,-f设置为前台。在另一个窗口获取容器IP地址,然后可以成功访问页面。但是通过port查看端口,其实是没有暴露的。这是关闭容器。

dockerfile 字符串拼接 docker编排文件_dockerfile_13

dockerfile 字符串拼接 docker编排文件_dockerfile 字符串拼接_14

dockerfile 字符串拼接 docker编排文件_docker_15

8.起镜像的时候通过-P参数对端口进行暴露。通过port查看端口转发。然后在另一台机器上对宿主机的转发端口进行访问,可以显示容器运行的网页界面。

dockerfile 字符串拼接 docker编排文件_centos_16

dockerfile 字符串拼接 docker编排文件_linux_17

9.重新编排,通过ENV设置变量DOC_ROOT和WEB_SERVER_PACKAGE。重新生成镜像,用镜像起容器。然后运行容器查看相应的文件,可以看到文件。

dockerfile 字符串拼接 docker编排文件_centos_18

dockerfile 字符串拼接 docker编排文件_docker_19

10.再次起容器,通过printenv输出环境变量。通过-e参数输入一个环境变量数值后,再次printenv输出环境变量,此时-e输入的环境变量数值已经在环境中替换了原有的值。但是,在容器中,并不会按照传入的值运行容器,因为传入的参数值是适用于docker build阶段RUN命令,而不适用docker run阶段的CMD命令。

dockerfile 字符串拼接 docker编排文件_linux_20

11.为了说明docker build阶段的RUN命令,我们再次修改编排文件,增加RUN,注意这里有多行的时候用&& \(前面的指令执行完成才执行后面的指令,并且将每个指令分为一行便于识别)。起容器之后查看执行的结果,发现执行了RUN的指令。

dockerfile 字符串拼接 docker编排文件_linux_21

dockerfile 字符串拼接 docker编排文件_linux_22