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
#### 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;"]