Docker 之 RUN

参考:https://docs.docker.com/engine/reference/builder/#run

RUN 有两种形式

  • RUN <command>  (shell form,命令在shell中运行,默认为Linux上的 /bin/sh -c 或 Windows上的 cmd /S /C)
  • RUN ["executable", "param1", "param2"] (exec form)

RUN指令将在当前image之上的新层中执行任何命令并提交结果。生成的提交图像将用于Dockerfile中的下一步.

分层RUN 指令和生成提交符合Docker的核心概念,其中提交很便宜,可以从映像历史中的任何点创建容器,很像源代码控制。

exec form 可以避免使用shell字符串,并使用不包含指定的shell可执行文件的基本映像运行命令。

可以使用shell命令更改shell窗体的默认shell。

shell form中,您可以使用\(反斜杠)将单个运行指令延续到下一行。例如,考虑这两行:

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

它们合起来等于这一行:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

注意:要使用不同于' /bin/sh '的shell,请使用传入所需shell的exec form 。例如

RUN ["/bin/bash", "-c", "echo hello"]

注意:exec form 被解析为JSON数组,这意味着必须在单词周围使用双引号("),而不是单引号(')。

注意:与shell form不同,exec form 不调用命令shell。这意味着不会发生正常的shell处理。例如,RUN ["echo", "$HOME"]不会对$HOME执行变量替换。如果您想要shell处理,那么要么使用shell表单,要么直接执行shell,例如:运行["sh", "-c", "echo $HOME"]。当使用exec form 并直接执行shell时(如shell form 的情况),执行环境变量扩展的是shell,而不是docker.

注意:在JSON格式中,必须转义反斜杠。这在以反斜杠为路径分隔符的窗口中特别相关。下面这行代码由于不是有效的JSON,将被视为shell表单,并以一种意外的方式失败:运行["c:\windows\system32\tasklist。本例的正确语法是:RUN ["c:\\windows\\system32\\tasklist.exe"]

 

Docker是一个开源的容器化平台,可以将应用程序及其依赖关系打包成一个独立的容器,然后在任何环境中进行部署和运行。在构建和管理容器时,Docker使用了一个运行时引擎来管理和运行容器。 Docker的运行时引擎是由多个组件组成的,其中最重要的是runc。runc是一个轻量级的容器运行时工具,它使用Linux容器(LXC)技术来创建和管理容器。runc提供了一个标准的接口,可以在不同的操作系统上运行容器,包括Linux、Windows和Mac等。 然而,如果在Docker中没有runc,可能有以下几种情况: 1. 没有正确安装Dockerrunc是Docker的一个重要组件,如果没有正确安装Dockerrunc可能会丢失或未正确配置。 2. 使用了替代的容器运行时引擎:Docker不是唯一的容器化平台,还有其他类似的平台,如Kubernetes等。这些平台可能使用自己的容器运行时引擎来管理和运行容器,而不是使用runc。 3. 版本不兼容:runc是一个开源的工具,它有自己的版本和更新周期。如果Dockerrunc的版本不匹配,可能会导致runc无法运行或被替代。 总而言之,runc是Docker的一个重要组件,用于管理和运行容器。如果在Docker中没有runc,那可能是由于安装配置问题、使用了替代的容器运行时引擎或版本不兼容等原因所致。在使用Docker时,建议确保正确安装和配置runc,以便正常使用容器的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值