【云原生 | 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 | 配置当创建的镜像作为其他镜像的基础镜像是,所指定的创建操作指令 |
|