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 系统的作业中,它会就地运行命令,不启动容器: 这些系统上的作业通常已经运行在 devenv 镜像中。但这些变量标识的是 CI 系统,而不是容器,所以 CLI 还会检查当前进程是否真的处于容器内。它会查看 /.dockerenv、/run/.containerenv、container 环境变量,以及 1 号进程的 cgroup 中是否出现容器运行时。 只有两者都成立时,命令才会就地运行。没有 container: 块的 GitHub Actions 或 GitLab CI 作业直接运行在运行器上,因此 CLI 会在那里启动容器,并打印一行说明。 就地运行时,命令的行为如下:
  • 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 中的计算机,仍然会启动容器。

自行选择运行方式

LAGER_EXEC_IN_PLACE 可以覆盖这项检查。设为 1、true 或 yes 表示就地运行命令,设为 0、false 或 no 表示启动容器。其他取值会被忽略,CLI 回退到自己检测到的结果。
LAGER_EXEC_IN_PLACE 只影响 lager exec,不影响其他任何命令。设置它之后,Box 锁、锁的持有者和冲突等待时间都保持不变。
LAGER_CI_OVERRIDE 在这里仍然有效,但代价更大。它会让看到它的其他每条 lager 命令停止识别 CI:此时 Box 锁会立即失败而不是等待,除非设置了 LAGER_LOCK_WAIT;并且锁的持有者会是您的用户名,而不是该 CI 作业。推荐使用 LAGER_EXEC_IN_PLACE=0,它可以启动容器而不影响锁。

与其他命令的区别

已保存命令的管理

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

示例

说明

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