什么是Dockerfile
Dockerfile是一个纯文本文件,里面记录了一系列构建命令,每个指令都会生成一个Layer,Docker顺序执行这个文件里的步骤最终就会创建出一个新的镜像。
编写Dockerfile
FROM
构建镜像的第一条指令必须是FROM,FROM作用是用于选择基础镜像。
eg:
FROM alpine:3.15 #选择Alpine镜像
FROM ubuntu:bionic #选择Ubuntu镜像
COPY
如果需要将一些文件打包到镜像中(例如一些源码、配置)。可以使用COPY命令,用法类似Linux cp命令,但是复制的源文件必须是“构建上下文”的路径,不能随意指定文件。“构建上下文”是指docker build执行时所在的目录。
eg:
COPY ./aa.xml /tmp/aa.xml #将上下文中aa.xml复制到镜像的/tmp目录下
COPY /etc/host /tmp #错误,不能使用上下文之外的文件
RUN
RUN指令包含很多shell指令。Dockerfile里一条指令只能是一行,因此RUN指令每行末尾使用续行符 \,命令之间需要使用 && 来连接。如果shell命令过长,可以将这些命令集中到一个脚本文件中,用COPY命令复制到镜像中使用RUN来执行
eg:
COPY ./setup.sh /tmp/ # 复制脚本到tmp目录
RUN cd /tmp && chmod +x setup.sh \ #到tmp目录,添加执行权限
&& ./setup.sh && rm setup.sh # 执行脚本并在执行后删除
ARG 和 ENV
这两条指令都可以用来创建变量,实现参数化运行。它们的区别在于ARG创建的变量在镜像构建过程中可见,容器运行是不可见。ENV 镜像构建以及容器运行时都可见。
eg:
ARG USER="root"
ENV USER="root"
EXPOSE
EXPOSE 指令用来暴露对外服务的端口号
EXPOSE 443 # 默认tcp协议
EXPOST 53/udp # 指定udp协议
每条指令都会生产一个镜像层,Dockerfile中不要滥用指令,尽量精简合并,避免镜像臃肿不堪。
docker build
Dockerfile 必须经过docker build 才能生效。
docker打包时会将上下文中所有文件都进行打包,为了避免不必要的文件上次打包影响打包效率,可以在“构建上下文”中创建 .dockerignore文件,排除不需要的文件。该文件语法与.gitignore类似。
eg:
#docker ignore
*.swp
*.sh
docker build 可以使用 -f 显式指定Dockerfile文件,如果不指定这个参数会默认找到当前目录下Dockerfile文件。
docker build 使用 -t 指定镜像标签,这样构建完成后会自动为镜像添加名字。
eg:
docker build -f ./Dockerfile -t my_image:1.0.0