Dockerfile文件编写
- Dockerfile是一种可以用于创建镜像的文件,类似于makefile,它是一个包含了所有用于创建镜像的命令的有序序列的文本文件
Dockerfile文件基本指指令
FROM
用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令。
FROM <环境> as <命名名字>
# FROM golang as builder
# FROM golang:1.14.2 as golang-builder
WORKDIR
工作目录
WORKDIR <工作目录路径>
RUN
用于在镜像中执行命令,这会创建新的镜像层。每个 RUN 指令创建一个新的镜像层。
RUN <命令行命令>
# RUN yum install weget
# RUN go env -w GOPROXY="https://mirrors.aliyun.com/goproxy/" && go env -w GO111MODULE=on && go build
COPY
用于将文件作为一个新的层添加到镜像中。通常使用 COPY 指令将应用代码赋值到镜像中。
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
# COPY . ./
# COPY --from=builder /go/src/demo /usr/bin
EXPOSE
用于记录应用所使用的网络端口。
EXPOSE <端口>
# EXPOSE 80
USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)
USER <用户名>[:<用户组>]
-
ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD
的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。ADD
的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
-
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENTRYPOINT
用于指定镜像以容器方式启动后默认运行的程序
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
# ENTRYPOINT [ "/bin/sh", "/app/start.sh" ]
# ENTRYPOINT ["/usr/bin/sh"]
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:- CMD 在docker run 时运行。
- RUN 是在 docker build。
示例
FROM golang as builder
WORKDIR /1/
COPY . ./
RUN go env -w GOPROXY="https://mirrors.aliyun.com/goproxy/" && go env -w GO111MODULE=on && go build demo1.go
FROM alpine
COPY --from=builder /1/demo1 /usr/bin/
ENTRYPOINT ["/usr/bin/sh"]