如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 **指令(Instruction)**,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
以定制centos镜像为例,这次使用Dockerfile来定制
一、创建Dockerfile空白文件
1 | mkdir /opt/docker_centos |
二、根据Dockerfile指令,编辑定制内容
要定制Dockerfile文件,首先要明确其各指令的作用
FROM
1
FROM centos
FROM用来指定一个基础镜像,如:centos或nginx等等,FROM指令必须是第一条指令。
除了基础镜像外,Docker还存在一个特殊的镜像,名为scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。对于 Linux 下静态编译的程序【如Go语言】来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接
FROM scratch
会让镜像体积更加小巧。
RUN
RUN
指令是用来执行命令行命令的,其有两种格式:shell格式: RUN <命令>
1
2
3RUN cd /root
RUN echo "Dockerfile Test"
RUN ls -lh
COPY 复制文件
COPY指令用于复制文件;
格式:COPY –chown=
: <源路径> <镜像内目标路径> 1
COPY ./test /home/test/
CMD 容器启动命令
CMD用来指定容器的启动命令,启动命令需要在前台运行,否则当命令启动后容器就退出了。
格式:CMD <启动命令>
1
2
3
4示例:
CMD ["/bin/bash"]
或
CMD ["sh","run.sh"]ENTRYPOINT
ENTRYPOINT的格式和RUN指令格式和作用一样,都是在指定容器启动程序和参数
建议习惯性使用这个指令,而不是CMD,具体区别:参考
ENV 设置环境变量
格式:ENV
1
2
3
4
5
6示例
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc当设置了环境变量之后,其他指令均可以直接在命令中调用此变量
EXPOSE 暴露端口
格式为: EXPOSE <端口1> [<端口2>…]
EXPOSE 指令是声明运行时容器提供服务端口,这仅仅是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
WORKDIR 指定工作目录
格式: WORKDIR <工作目录路径>
使用
WORKDIR
指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。USER指定当前用户
格式:USER <用户名>[:<用户组>]
USER
只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。1
2
3
4示例:
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]
三、构建镜像
Dockerfile文件根据各自需求定制完成后,现在就可以进行构建这个镜像了。使用 docker build 命令进行镜像的构建,格式如下:
1 | 构建镜像格式 |
1 | 例如: |
构建后,镜像就可以直接使用了
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2019/12/02/使用Dockerfile制作镜像/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!