Dockerfile详细解析(七)——CMD

CMD

CMD 指令有三种形式:

  • CMD ["executable","param1","param2"](exec 形式,这个是推荐的形式)
  • CMD ["param1","param2"](在ENTRYPOINT作为默认参数)
  • CMD command param1 param2 (shell 形式)

Dockerfile中只能有一个 CMD 指令。如果你列出超过一个CMD,那么只有最后一个 CMD 会生效。

CMD的主要目的是为了提供运行容器的默认方法。这些默认方法可以包含一个可执行脚本,或者它们可以省略这个可执行脚本,在这种情况你还必须指定一个ENTRYPOINT 指令。

注意:如果 CMD 被用来提供作为ENTRYPOINT指令的默认参数,CMDENTRYPOINT 两个指令都要使用 JSON 数组格式来指定。

注意exec 被解析为 JSON 数组,意味着你必须使用双引号(")包围单词而不是单引号(’)。

注意:不像shell形式,exec形式不启用命令shell。这个意味着正常的 shell 处理过程是不会发生的。例如 CMD [ "echo", "$HOME" ]是不会把$HOME变量替换。如果你想 shell 处理那么可以使用 shell形式或者直接执行一个shell,例如:CMD [ "sh", "-c", "echo $HOME" ]。当使用 exec的形式和直接执行shell,与shell形式的情况 一样,这个是shell做环变量的扩展而不是docker。

当使用了shell或者exec的格式,CMD 指令会设置命令在镜像运行时执行。

如果你使用了CMDshell形式,那么<command>将会在/bin/sh -c运行。

FROM ubuntu
CMD echo "This is a test." | wc -

如果你想运行你的<command>而不用shell那么你一定要把命令用JSON数组开表示和在执行脚本中使用全路径。CMD推荐使用数组形式的格式。任何附加参数必须单独表示为数组中的字符串:

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

如果你想你的容器每次运行一样的可执行脚本,那么你应该考虑组合使用ENTRYPOINTCMD。参考ENTRYPOINT.

如果用户指定参数到docker run,那么将会覆盖CMD默认指定的参数。

注意:不要混淆RUNCMDRUN 实际上运行一个命令和提交结果;CMD在构建的过程作不是执行任何东西,但指定了镜像预设的命令(启动容器时运行的命令)。

### 创建和使用 Alpine Linux Dockerfile 对于希望构建轻量级镜像的开发者来说,Alpine Linux 是一种理想的选择。以下是创建基于 Alpine 的 Dockerfile 并将其用于容器化的指南。 #### 编基础 Dockerfile 为了启动项目,在 `Dockerfile` 中指定基础镜像: ```dockerfile FROM alpine:latest ``` 这行代码选择了官方维护的最新版本 Alpine 镜像作为起点[^1]。 #### 安装必要的软件包 由于 Alpine 使用的是 musl libc 和 busybox 工具集,默认情况下许多常见的 GNU/Linux 命令可能存在。因此,通常需要安装额外的应用程序或库来满足应用需求。例如,如果要运行 Python 应用,则可以这样做: ```dockerfile RUN apk add --no-cache python3 py3-pip ``` 这里通过 APK 包管理器安装了 Python 以及 pip 工具,并加上了 `--no-cache` 参数以减少最终镜像大小[^2]。 #### 设置工作目录与复制文件 定义一个合适的工作路径并把本地源码拷贝进去: ```dockerfile WORKDIR /app COPY . . ``` 这两条指令分别设置了当前操作位置为 `/app` 文件夹并将主机上的所有内容传输到该处[^3]。 #### 运行命令和服务配置 最后一步是告诉 Docker 如何启动应用程序。假设有一个名为 `main.py` 的入口脚本,那么可以在 Dockerfile 结尾添加如下语句: ```dockerfile CMD ["python3", "./main.py"] ``` 此部分指定了当容器实例化时应执行的具体动作——即调用解释器解析给定的 Python 脚本[^4]。 --- 完整的示例 Dockerfile 可能看起来像这样: ```dockerfile # Use official lightweight base image. FROM alpine:latest # Install required packages without caching them in layers. RUN apk add --no-cache \ python3 \ py3-pip # Set working directory inside container. WORKDIR /app # Copy current folder's content into app dir within container. COPY . . # Define default command to execute when running the container. CMD ["python3", "./main.py"] ``` 上述过程展示了如何利用简单的几行声明式语法快速搭建起适合大多数场景的基础环境。当然实际生产环境中还需要考虑更多因素如安全加固、多阶段构建优化等高级话题[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值