Dockerfile中执行命令的几种方式

2023-10-28 12:34:21 浏览数 (2)

概述

Dockerfile 是用于构建 Docker 镜像的文本文件,提供了一系列构建指令和配置,用于自动化和标准化 Docker 镜像的构建流程。一个 Dockerfile 可以通过依次执行每行命令来创建一个新的 Docker 镜像。因此,执行命令与 Dockerfile 的编写和构建密不可分。

在 Dockerfile 中,可以使用多种方式执行命令:

RUN 命令: RUN 命令是最常用的一种方式,它允许在构建 Docker 镜像期间执行任意命令。例如:

代码语言:javascript复制
RUN apt-get update && apt-get install -y python

CMD 命令: CMD 命令用于指定容器启动时要执行的默认命令。它可以在 Dockerfile 中只出现一次且必须是最后一个命令。例如:

代码语言:javascript复制
CMD ["python", "app.py"]

ENTRYPOINT 命令: ENTRYPOINT 命令用于指定容器启动时要执行的默认命令,并且不支持被覆盖。例如:

代码语言:javascript复制
ENTRYPOINT ["python", "app.py"]

SHELL 命令: SHELL 命令用于指定运行在 RUN 命令中的 SHELL。默认的 SHELL 是 /bin/sh -c,但也可以在 Dockerfile 中指定其它的 SHELL。例如:

代码语言:javascript复制
SHELL ["/bin/bash", "-c"]

需要注意的是,这些命令的主要区别在于何时执行命令。RUN 命令在构建期间执行,CMD 和 ENTRYPOINT 在容器启动时执行。SHELL 可以用于在 RUN 命令中指定更多的 SHELL 选项。在 Dockerfile 中可以结合使用这些命令以完成更复杂的操作。

RUN 命令 (构建时运行)

RUN 命令简介

RUN 命令是 Dockerfile 中常用的一种命令,它表示需要在构建 Docker 镜像时执行的命令。

RUN 命令实际上是在一个新的临时容器中执行所指定的命令,并在这个过程中创建新的镜像层,在最终的 Docker 镜像中保存这些更改。

RUN命令语法:

  1. RUN ["command", "param1", "param2"]:用于指定要运行的可执行文件及其所需参数。
  2. RUN command1 && command2:用于在同一行中运行多个命令,以便节省Docker镜像的层数。

注意点和使用技巧

一条 RUN 命令只能提交一个镜像层,因此为了最小化镜像大小,应该在同一个 RUN 命令中执行多个命令,并使用一些好的构建最佳实践(例如删除不需要的软件包和临时文件等)。

通常将多个命令合并到一条 RUN 命令中执行:

使用 && 连接多个命令,使用 分行

使用 && 连接多条命令可将多个命令合并为一条 RUN 命令,一旦其中某个命令失败了,后续命令都不会再执行。例如:

代码语言:javascript复制
RUN apt-get update && 
    apt-get upgrade -y && 
    apt-get install -y software-properties-common && 
    add-apt-repository ppa:deadsnakes/ppa && 
    apt-get install -y python3.6 && 
    apt-get clean

CMD 命令(启动时运行)

CMD命令简介

CMD 命令用于 Docker 镜像的默认启动命令,表示容器启动时要执行的默认操作。

CMD 指令只能在 Dockerfile 中出现一次,如果有多个 CMD 指令,则只有最后一个 CMD 指令生效。

CMD 命令有两种形式,分别是 exec 形式和 shell 形式:

  1. EXEC 形式

EXEC 形式中 CMD 指令的语法如下:

代码语言:javascript复制
CMD ["executable","param1","param2"] # CMD ["python", "app.py"]

其中,executable 指的是将要运行的可执行文件或脚本,param1、param2 等参数代表这个程序的命令行参数,可以省略参数。指令参数是一个 JSON 数组。

  1. SHELL 形式

SHELL 形式中的 CMD 指令语法如下:

代码语言:javascript复制
CMD command param1 param2 # CMD python app.py

其中,command 表示将要运行的命令,param1 和 param2 为可选的命令行参数。

注意点和使用技巧

CMD 指令只能在 Dockerfile 中出现一次,如果有多个 CMD 指令,则只有最后一个 CMD 指令生效。

使用 SHELL 形式的 CMD 指令时,Docker 会自动在 /bin/sh 中启动 SHELL 并运行 CMD 指定的命令,由于 SHELL 不支持信号处理,可以使用 exec 形式的 CMD 指令,这样可以直接使用信号传递机制,并且能够获得更好的性能和资源管理。

ENTRYPOINT 命令

ENTRYPOINT 简介

ENTRYPOINT 命令用于设置默认的容器执行命令,与 CMD 命令类似,不同的是 ENTRYPOINT 命令设置的命令不会被覆盖,而是作为容器运行时的默认命令始终存在。

ENTRYPOINT 命令有两种形式:exec 形式和 shell 形式,具体的语法如下:

  1. 使用 exec 形式
代码语言:javascript复制
ENTRYPOINT ["executable", "param1", "param2"]

其中,executable 是在容器启动时要运行的可执行文件或脚本,param1param2 分别为该可执行文件或脚本的参数。可以省略参数。

  1. 使用 shell 形式
代码语言:javascript复制
ENTRYPOINT command param1 param2 
# ENTRYPOINT ["/bin/sh", "-c", "exec <exec_command>"]

其中,command 表示在容器启动时要运行的命令,在 shell 中执行。param1param2 是 command 命令的参数,可以省略。

注意点和使用技巧

ENTRYPOINT 命令的默认值和 CMD 命令的默认值可以同时存在,也可以互相随意组合。

如果 ENTRYPOINT 命令有多个,只有最后一个命令有效。

同时,也可以使用 shell 的 exec 命令来实现 ENTRYPOINT 命令的 exec 形式,例如:

代码语言:javascript复制
ENTRYPOINT ["/bin/sh", "-c", "exec <exec_command>"]

其中,<exec_command> 表示使用的可执行命令。

SHELL 命令(构建时运行)

SHELL命令简介

SHELL 命令用于在 Dockerfile 中指定运行在 RUN 命令的 SHELL。SHELL 命令有两种形式:使用 SHELL 指令更改默认 shell 或者在 RUN 命令中临时更改 shell。

1.使用 SHELL 指令更改默认 shell

SHELL 指令语法为:

代码语言:javascript复制
SHELL ["executable", "parameters"] # SHELL ["/bin/bash", "-c"]

其中,executable 为默认的 SHELL 可执行程序,parameters 用于设置 SHELL 程序的参数,可以省略。在 Dockerfile 中使用 SHELL 指令更改默认 shell 可以改变整个 Dockerfile 中所有的 RUN

  1. 在 RUN 命令中临时更改 shell

在 RUN 命令中可以通过 SHELL 命令来临时更改 shell。使用 SHELL 命令可以将构建环境的 shell 上下文更改为指定的 shell,并在 RUN 指令中执行 SHELL 命令。在 RUN 命令中使用 SHELL 命令的语法为:

代码语言:javascript复制
RUN ["/bin/sh", "-c", "SHELL command"]
# RUN ["/bin/sh", "-c", "SHELL=/bin/bash apt-get update"]

其中,command 部分表示希望在临时 shell 中执行的命令。例如:

代码语言:javascript复制
复制代码
RUN ["/bin/sh", "-c", "SHELL=/bin/bash apt-get update"]

则会在临时的 bash shell 中执行 apt-get update 命令。

注意点和使用技巧

需要注意的是,RUN 命令中的 SHELL 命令在 RUN 命令结束后会被自动清除,RUN 下一行将会使用默认 shell 上下文,并且没有从之前的 SHELL 指定中继承环境变量。

总之,SHELL 命令用于更改 Dockerfile 中的 shell 上下文,可以通过 SHELL 指令更改默认 shell 或者在 RUN 命令中临时更改 shell,根据实际需求可以使用不同的方式来更改 Dockerfile 中的 shell 上下文。

总结

本文从 RUN 命令、CMD 命令、 ENTRYPOINT 命令、SHELL命令四个方面对 Dockerfile 中的常用命令进行了介绍。

其中,RUN 命令用于在 Docker 镜像中执行指定的命令并创建新的镜像层,CMD 命令则用于设置在容器启动时需要执行的默认命令,而ENTRYPOINT 命令则用于设置容器启动时的默认命令,并且设置的命令不会被覆盖。此外,本文还介绍了如何在 RUN 命令中执行多条命令、如何使用 SHELL 命令更改默认 SHELL 和如何在 RUN 命令中临时更改 SHELL 的方法和语法。了解这些常用的 Dockerfile 命令可以使 Docker 镜像的构建更加高效和方便。

命令名称

执行时间

描述

RUN

构建时

在 Docker 镜像中执行指定的命令并创建新的镜像层

SHELL

构建时

在容器启动时需要执行的默认命令

CMD

启动时

设置容器启动时的默认命令,并且设置的命令不会被覆盖

ENTRYPOINT

启动时

在 RUN 命令中临时更改 SHELL

0 人点赞