【Docker系列】入门二:构建

231 阅读2分钟

dockerfile构建(语法参考

1.命令

docker build [OPTIONS] -f- PATH

2.镜像、容器和层

docker镜像是由一系列层组成的,每一层代表dockerfile中的每条指令。并且每一层都是只读的,创建容器时,就在(镜像)最外层基础层之上添加一个新的可写层(“容器层”),运行中的容器所做的所有更改(例如写入新文件,修改现有文件和删除文件)都将写入可写层。

注意:由于每个容器都有自己的可写层,并且修改数据都是在自己的可写层中,所以多个容器可以共享对同一基础镜像的访问,但具有自己的数据状态。删除容器后,可写层也会被删除,基础镜像保持不变。如果想所有容器共享相同的数据,请将数据存储在docker的volume卷(容器删除,volume卷不会被删除)中再挂载到容器

3.存储驱动程序

Docker使用存储驱动程序来管理图像层和可写容器层的内容。每个存储驱动程序对实现的处理方式不同,但是所有驱动程序都使用可堆叠的图像层和写时复制(CoW)策略

4.构建建议

  • 确定上下文 构建时,需要指定dockerfile和文件上下文,如果不指定默认是当期路径
  • .dockerignore排除文件

构建镜像时如果包含了不需要的文件增加上下文和镜像大小,导致构建、拉取和推送镜像的时间以及容器运行的时间增加,所有需要排除不要的文件

FROM golang:1.11-alpine AS build  

# Install tools required for project
# Run `docker build --no-cache .` to update dependencies
RUN apk add --no-cache git
RUN go get github.com/golang/dep/cmd/dep

# List project dependencies with Gopkg.toml and Gopkg.lock
# These layers are only re-built when Gopkg files are updated
COPY Gopkg.lock Gopkg.toml /go/src/project/
WORKDIR /go/src/project/
# Install library dependencies
RUN dep ensure -vendor-only

# Copy the entire project and build it
# This layer is rebuilt when a file changes in the project directory
COPY . /go/src/project/
RUN go build -o /bin/project

# This results in a single layer image
FROM scratch
COPY --from=build /bin/project /bin/project
ENTRYPOINT ["/bin/project"]
CMD ["--help"]

  • 将参数进行排序
  • 利用缓存