> 文档中心 > 【云原生 | Docker篇】深入Dockerfile

【云原生 | Docker篇】深入Dockerfile

Dockerfile是用于定义Docker容器镜像的文本文件。通过深入了解Dockerfile的各种命令和功能,开发者可以更加灵活和高效地构建、部署和管理容器化应用。本文将从基础命令开始,逐步深入探讨每个命令的使用方法及其在实际应用中的场景。

前言

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile可以分为四部分:基础镜像信息、维护者信息、镜像操作指令和启动时执行指令。

一、命令说明

Dockerfile由一系列指令组成,每条指令都有特定的功能。以下是一些常用指令的说明:

  • FROM:指定基础镜像。
  • MAINTAINER:指定维护者信息,已经过时,可以使用LABEL maintainer=xxx 来替代。
  • RUN:运行命令。
  • CMD:指定启动容器时默认的命令。
  • ENTRYPOINT:指定镜像的默认入口。
  • EXPOSE:声明镜像内服务监听的端口。
  • ENV:指定环境变量,可以在docker run的时候使用-e改变,会被固化到image的config里面。
  • ADD:复制指定的src路径下的内容到容器中的dest路径下,src可以为url会自动下载,可以为tar文件,会自动解压。
  • COPY:复制本地主机的src路径下的内容到镜像中的dest路径下,但不会自动解压等。
  • LABEL:指定生成镜像的元数据标签信息。
  • VOLUME:创建数据卷挂载点。
  • USER:指定运行容器时的用户名或UID。
  • WORKDIR:配置工作目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
  • ARG:指定镜像内使用的参数(如版本号信息等),可以在build的时候,使用--build-args改变。
  • ONBUILD:配置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令。

二、FROM

FROM命令用于指定基础镜像。例如:

FROM ubuntu:latest

这行代码指定了使用Ubuntu的最新版本作为基础镜像。

三、LABEL

LABEL命令用于指定生成镜像的元数据标签信息。例如:

LABEL version="1.0" author="John Doe"

这行代码为镜像添加了版本和作者标签。

四、RUN

RUN命令用于运行命令。例如:

RUN apt-get update && apt-get install -y curl

这行代码更新了包列表并安装了curl工具。

五、CMD和ENTRYPOINT

CMD和ENTRYPOINT用于指定启动容器时默认的命令。

5.1、都可以作为容器启动入口

例如:

CMD ["echo", "Hello World"]

5.2、只能有一个CMD

Dockerfile中只能有一个CMD命令。

5.3、CMD为ENTRYPOINT提供默认参数

例如:

ENTRYPOINT ["echo"]
CMD ["Hello World"]

运行容器时如果不指定参数,默认会输出"Hello World"。

5.4、组合最终效果

可以使用CMD和ENTRYPOINT组合来实现复杂的功能。例如:

ENTRYPOINT ["echo"]
CMD ["Hello World"]

运行容器时如果不指定参数,默认会输出"Hello World"。如果指定了参数,则会覆盖默认的CMD参数。

5.5、docker run启动参数会覆盖CMD内容

例如:

docker run myimage "Hello Docker"

这行代码会覆盖默认的CMD参数,输出"Hello Docker"。

六、ARG和ENV

ARG用于指定镜像内使用的参数,可以在build的时候使用--build-args改变。ENV用于指定环境变量,可以在docker run的时候使用-e改变,会被固化到image的config里面。

6.1、ARG

例如:

ARG MY_ARG=default_value

6.2、ENV

例如:

ENV MY_ENV=production

6.3、综合测试示例

结合使用ARG和ENV来构建镜像。例如:

ARG VERSION=latest
FROM ubuntu:$VERSION
ENV APP_ENV=production
CMD ["echo", "App is running in $APP_ENV"]

在构建镜像时可以使用--build-args参数来改变版本,例如:

docker build --build-args VERSION=1.0 .

七、ADD和COPY

ADD和COPY用于复制文件和目录到镜像中。

7.1、COPY

例如:

COPY . /app

7.2、ADD

例如:

ADD https://example.com/file.tar.gz /app

ADD命令还可以自动解压tar文件。

八、WORKDIR和VOLUME

WORKDIR用于配置工作目录,VOLUME用于创建数据卷挂载点。

8.1、WORKDIR

例如:

WORKDIR /app

这行代码将工作目录设置为/app。

8.2、VOLUME

例如:

VOLUME ["/data"]

这行代码创建了一个数据卷挂载点/data。

九、USER

USER用于指定运行容器时的用户名或UID。例如:

USER user

这行代码指定容器以user用户运行。

十、EXPOSE

EXPOSE用于声明镜像内服务监听的端口。例如:

EXPOSE 80

这行代码声明容器监听80端口。

十一、multi-stage builds

multi-stage builds用于在构建镜像时使用多个阶段,以减小最终镜像的体积。例如:

11.1、使用

例如:

FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["./myapp"]

11.2、生产示例

文章目录

深入Dockerfile

前言

一、命令说明

二、FROM 

三、LABEL

四、RUN  

五、CMD和ENTRYPOINT

5.1、都可以作为容器启动入口

5.2、只能有一个CMD

5.3、CMD为ENTRYPOINT提供默认参数

5.4、组合最终效果

5.5、docker run启动参数会覆盖CMD内容 

六、ARG和ENV

6.1、ARG

6.2、ENV

6.3、综合测试示例 

七、ADD和COPY

7.1、COPY

7.2、ADD

八、WORKDIR和VOLUME

8.1、WORKDIR

8.2、VOLUME

九、USER

十、EXPOSE

十一、multi-stage builds

11.1、使用

11.2、生产示例

十二、Images瘦身实践 

十三、springboot java 最终写法


深入Dockerfile

前言

博主语录:一文精讲一个知识点,多了你记不住,一句废话都没有

经典语录:一厢情愿,就得愿赌服輸

一、命令说明

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般而言,Dockerfile可以分为四部分

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 启动时执行指令 
指令 说明
FROM 指定基础镜像
MAINTAINER 指定维护者信息,已经过时,可以使用LABELmaintainer-xxx来替代
RUN 运行命令v
CMD 指定启动容器时默认的命令v
ENTRYPOINT 指定镜像的默认入口.运行命令v
EXPOSE 声明镜像内服务监听的端口v
ENV 指定环境变量,可以在docker run的时候使用-e改变v;会被固化到image的config里面
ADD 复制指定的src路径下的内容到容器中的dest路径下,src可以为url会自动下载,可以为tar文件,会自动解压
cOPY 复制本地主机的src路径下的内容到镜像中的dest路径下,但不会自动解压等
LABEL 指定生成镜像的元数据标签信息
VOLUME 创建数据卷挂载点
USER 指定运行容器时的用户名或UID
WORKDIR 配置工作目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录
ARG 指定镜像内使用的参数(如版本号信息等),可以在build的时候,使用--build-args改变v
OBBUILD 配置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令