Skip to main content
在您本机的 Docker 开发容器内运行 shell 命令。命令可以直接内联运行,也可以保存为命名别名以便复用。在已经运行于 devenv 镜像中的 CI 作业里,命令会就地运行。请参阅在 CI 中运行

语法

选项

参数

前置条件

必须先创建开发环境:
这会配置 lager exec 所使用的 Docker 镜像、挂载目录和 shell。

命令参考

运行内联命令

保存命令以便复用

运行已保存的命令

追加额外参数

对以短横线开头的额外参数,请在它们之前写上 --。否则,如果某个参数与 lager exec 自己的选项同名(例如 --verbose),它会被 lager exec 自己吃掉。

传递环境变量

--passenv 把您 shell 中的值复制到容器里。请不要传 PATH:宿主机的值会替换镜像的 PATH,容器随后就找不到自己的工具了。

在 CI 中运行

lager exec 在启动容器之前会先读取 CI 环境变量。在下列 CI 系统的作业中,它会就地运行命令,不启动容器: CLI 认为这样的作业已经运行在 devenv 镜像中。识别只读取这些变量,不检查是否处于容器内。没有 container: 块的 GitHub Actions 或 GitLab CI 作业同样会就地运行命令,也就是直接运行在运行器上。 就地运行时,命令的行为如下:
  • shell 取自 .lager 中 DEVENV 的 shell,否则为 /bin/bash
  • 命令在当前目录运行,mount_dir 不生效。
  • 命令获得作业的环境变量,外加 .lager 中的 environment 和每个 --env--passenv 不起作用,因为作业环境本来就已存在。
  • 命令的退出码就是 lager exec 的退出码。
  • --mount--volume--user--group 不起作用。如果您传入其中任何一个, CLI 会打印一行警告,例如 Warning: --mount, --volume ignored: the command runs in the current container, so there is nothing to start.
  • --interactive--tty 不起作用。
Jenkins 代理、其他 CI 系统,或者不在 CI 中的计算机,仍然会启动容器。 若要在被 CLI 识别为 CI 的作业中启动容器,请把 LAGER_CI_OVERRIDE 设为任意非空值。0 也算非空。
LAGER_CI_OVERRIDE 也会让看到它的其他每条 lager 命令停止识别 CI。此时 Box 锁会立即失败而不是等待,除非设置了 LAGER_LOCK_WAIT。并且锁的持有者会是您的用户名,而不是该 CI 作业。请只在运行 lager exec 的那一步设置这个变量。

与其他命令的区别

已保存命令的管理

已保存的命令存放在您 .lager 配置的 devenv 段中。请用 lager devenv 管理它们:

示例

说明

  • 容器以 --rm 创建,因此每条命令执行完后都会被移除
  • 容器中的退出码会传递给 CLI
  • 您 shell 中每一个 LAGER* 环境变量都会被传入容器
  • 源代码从您的本地文件系统挂载到容器中
  • 存在 ~/.lager 时,Lager 配置也会挂载到容器中
  • COMMAND 参数和 --command 选项互斥,只能用其中一个