Dockerfile多阶段构建

Dockerfile说明

Dockerfile常用指令

  1. FROM指令
    指定目标镜像的基础镜像
    例: FROM nginx

  2. RUM指令
    镜像制作过程中需要执行的命令
    格式:RUN <命令行命令>
    注: 大多数RUM命令会改变镜像内容,导致镜像层数增加,Dockerfile中应尽量少使用,或者多个命令合并成一条

      # 反例
      FROM centos
      RUN yum -y install wget
      RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
      RUN tar -xvf redis.tar.gz
      
      # 正例
      FROM centos
      RUN yum -y install wget \
      && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
      && tar -xvf redis.tar.gz
    
  3. COPY指令
    复制指令,从上下文目录中复制文件或者目录到容器里指定路径
    格式:COPY [--chown=:] <源路径1>... <目标路径>
    例:

    # 把上下文中的home.txt文件拷贝到容器/mydir目录
    COPY home.txt /mydir/
    
  4. CMD指令
    运行指定命令,一般作为容器指定默认要运行的程序,程序运行结束,容器也运行结束,与RUM命令的区别如下

    • CMD 在docker run 时运行
    • RUM 在docker build 时运行
      格式:
    CMD 
    CMD ["<可执行文件或命令>","","",...] 
    CMD ["","",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
    
  5. ENTRYPOINT指令
    类似于CMD指令,但其不会被docker run的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序

  6. WORKDIR指令指定的程序
    为dockerfile中RUMCMDENTRYPOINTCOPYADD命令设置工作目录,如果不存在会自动创建

Dockerfile 多阶段构建

构建注意事项:

  • 多阶段构建应尽量让最终镜像尽可能小,为提高docker缓存命中率,改变频率低的文件应尽量放在dockerfile文件中靠前的位置,多个RUM命令尽量合并在一起
  • 减少上下文中的文件大小,只传输必要的文件,不需要使用的文件可使用.dockerignore文件配合进行忽略
  • 最终镜像的COPY命令,尽量只包含最终运行所需要的文件,以减少运行容器的大小

以Java Maven项目为例:
构建命令: docker build -t : -f Dockerfile .

# 指定运行镜像
FROM openjdk:8-jre-alpine as base
# 设置工作目录
WORKDIR app
EXPOSE 8080

# 指定构建镜像
FROM maven:3.5.0-jdk-8-alpine AS build

# 设置编译工作目录
WORKDIR build
COPY . .
# package jar
RUN mvn clean package

# 将编译镜像中的jar包拷贝到最终镜像
FROM base as final 
WORKDIR app
# copy jar from the first stage
COPY --from=build build/target/my-app-1.0-SNAPSHOT.jar my-app-1.0-SNAPSHOT.jar

CMD ["java", "-jar", "my-app-1.0-SNAPSHOT.jar"]

nodejs例子:
构建命令:docker build -t : -f Dockerfile .

# 基础镜像
FROM nginx:latest as base
# 端口标识
EXPOSE 80

# 构建阶段镜像
FROM node:alpine as build
WORKDIR build
COPY . .
#RUN npm install --registry=https://registry.npm.taobao.org --verbose
RUN npm install && npm run build

# 将构建内容拷贝到最终镜像
FROM base as final
# copy dist from the first stage
COPY --from=build build/dist /usr/share/nginx/html

你可能感兴趣的:(docker,容器,运维)