Dockerfile 学习笔记

1. Dockerfile 简介

  1. Dockerfile 是什么

    Dockerfile 是镜像的描述文件

  2. Dockerfile 的作用

    通过 Dockerfile 文件我们可以自定义一个的镜像并构建出来

  3. 通过 Dockerfile 构建镜像的步骤

    1. 在指定位置创建一个 Dockerfile 文件
    2. 通过 Dockerfile 构建镜像
      docker build -t <image_name>:<version> <Dockerfile 文件位置>
      

在构建镜像的过程中,会在 Docker Cache 中生成每一条命令对应的临时镜像 tmp Image,以便于在 Dockerfile 被修改重新构建镜像时加快构建的速度,可以在构建时使用 --no-cache 命令取消缓存

下面是一些概念之间的关系

pull
push
save
load -i
run
commit
build
Docker Hub 仓库
Image 镜像
xxx.tar
Container 容器
Dockerfile

2. Dockerfile 基本语法

Dockerfile 语法官方网站: https://docs.docker.com/engine/reference/builder/

2.1 Dockerfile 内容基础

  1. 每条保留字指令都必须为大写,且后面都要跟至少一个参数。
  2. 指令按照从上到下,顺序执行。
  3. # 表示注释。
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交。

2.2 Dockerfile 保留字

保留字作用
FROM当前镜像所基于的镜像 第一个指令必须是FROM
RUN构建镜像时需要运行的指令
EXPOSE声明容器对外暴露的端口号
WORKDIR指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 包
COPY类似于 ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

FROM 指令

当前镜像所基于的镜像,在构建时会自动从 Docker Hub 拉取 base 镜像

必须作为 Dockerfile 的第一个指令出现

语法

FROM <image>
FROM <image>[:<tag>]
FROM <image>[@<digest>]

RUN 指令

RUN 指令将在当前映像之上的新层中执行任何命令并提交结果

生成的提交映像将用于 Dockerfile 中的下一步

语法

RUN <command> (shell form, the command is run in a shell, which by 
default is `/bin/sh -c` on Linux or `cmd /S /C` on Windows)
RUN echo hello

RUN ["executable", "param1", "param2"] (exec form)
RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE 指令

用来指定构建的镜像在运行为容器时对外暴露的端口

没有实际的作用,仅仅用于声明要暴露的端口

语法

EXPOSE 80/tcp 如果没有指定则默认暴露 tcp
EXPOSE 80/udp

WORKDIR 指令

用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录

如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也将被创建

语法

WORKDIR /path/to/workdir 指定原始镜像存在目录不存在目录
WORKDIR /a
WORKDIR b
WORKDIR c

注意: WORKDIR 指令可以在 Dockerfile 中多次使用。
如果提供了相对路径,则该路径将与先前 WORKDIR 指令的路径相对

ADD 指令

用来从 context 上下文复制新文件、目录或远程文件 url,并将它们添加到位于指定路径的映像文件系统中

语法

ADD hom* /mydir/ 通配符添加多个文件
ADD hom?.txt /mydir/ 通配符添加
ADD test.txt relativeDir/ 可以指定相对路径
ADD test.txt /absoluteDir/ 也可以指定绝对路径
ADD url 可以直接下载链接的文件

COPY 指令

阉割版的 ADD 指令,仅可用于从 context 上下文复制新文件、目录,并将它们添加到位于指定路径的映像文件系统中

ENV 指令

用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中

语法

ENV <key> <value>
ENV <key>=<value>

使用 $ 符号进行引用
WORKDIR $key

VOLUME

用于定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷

语法

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

CMD & ENTRYPOINT 指令

都是用来指定容器启动时默认执行指令

注意:CMD 指令可以存在多个但是存在多个只有最后一个生效

语法

RUN <command>
RUN ["executable", "param1", "param2"] 推荐

区别

  1. CMD 里面命令如果在运行容器时进行覆盖

    docker run <image>[:<version>] 覆盖命令

  2. ENTRYPOINT 里面命令如何在运行容器时进行覆盖

    docker run --entrypoint=覆盖指令 <image>[:<version>] 传递参数

组合使用方式
ENTRYPOINT 用来书写一个容器固定的指令

CMD 用来给 ENTRYPOINT 传递参数

注意:配合使用时必须使用 RUN ["executable", "param1", "param2"] 语法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值