Skip to content

1. 镜像构建篇

1.1 构建上下文

构建上下文build context,“上下文” 意为和现在这个工作相关的周围环境。在docker镜像的构建过程中有构建上下文build context这一概念,通俗的来说就是指执行docker build时当前的工作目录,不管构建时有没有用到当前目录下的某些文件及目录,默认情况下这个上下文中的文件及目录都会作为构建上下文内容发送给Docker Daemon

docker build开始执行时,控制台会输出Sending build context to Docker daemon xxxMB,这就表示将当前工作目录下的文件及目录都作为了构建上下文

前面提到可以在RUN指令中添加--no-cache不使用缓存,同样也可以在执行docker build命令时添加该指令以在镜像构建时不使用缓存

1.2 忽略构建

git忽略文件.gitignore一样的道理,在docker构建镜像时也有.dockerignore,可以用来排除当前工作目录下不需要加入到构建上下文build context中的文件

例如,在构建npm前端的镜像时项目时,在 Dockerfile 的同一个文件夹中创建一个 .dockerignore 文件,带有以下内容,这样在构建时就可以避免将本地模块以及调试日志被拷贝进入到Docker镜像中

node_modules
npm-debug.log
node_modules
npm-debug.log

1.3 多阶段构建

多阶段构建的应用场景及优势就是为了降低复杂性并减少依赖,避免镜像包含不必要的软件包

例如,应用程序的镜像中一般不需要安装开发调试软件包。如果需要从源码编译构建应用,最好的方式就是使用多阶段构建

简单来说,多阶段构建就是允许一个Dockerfile中出现多条FROM指令,只有最后一条FROM指令中指定的基础镜像作为本次构建镜像的基础镜像,其它的阶段都可以认为是只为中间步骤

每一条FROM指令都表示着多阶段构建过程中的一个构建阶段,后面的构建阶段可以拷贝利用前面构建阶段的产物

这里我列举一个编译构建npm项目,利用多阶段构建最终把静态资源制作成nginx镜像的Dockerfile

yaml
#### Stage 1: npm build
FROM node:12.4.0-alpine as build

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

# Copy the main application
COPY . ./

# Arguments

# Build the application
RUN npm run build

#### Stage 2: Serve the application from Nginx 
FROM nginx:latest

COPY --from=build /app/build /var/www

# Copy our custom nginx config
COPY nginx.conf /etc/nginx/nginx.conf

# Expose port 3000 to the Docker host, so we can access it 
# from the outside.
EXPOSE 80

ENTRYPOINT ["nginx","-g","daemon off;"]
#### Stage 1: npm build
FROM node:12.4.0-alpine as build

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

# Copy the main application
COPY . ./

# Arguments

# Build the application
RUN npm run build

#### Stage 2: Serve the application from Nginx 
FROM nginx:latest

COPY --from=build /app/build /var/www

# Copy our custom nginx config
COPY nginx.conf /etc/nginx/nginx.conf

# Expose port 3000 to the Docker host, so we can access it 
# from the outside.
EXPOSE 80

ENTRYPOINT ["nginx","-g","daemon off;"]