跳转到内容

mise oci run

[实验性] 从当前 mise.toml 构建一个 OCI 镜像并在其中运行命令

等同于依次执行 mise oci builddocker run / podman run。 构建的镜像会被加载到本地容器引擎中(podman 原生拉取 OCI 布局; docker 则通过 docker load 接收),并在其中执行给定的命令,同时继承 stdin/stdout/stderr。

需要设置 mise settings experimental=true(或 MISE_EXPERIMENTAL=1),并且 需要以下程序之一:podmandocker

参数

  • [-- CMD] — 要在容器内运行的命令及参数(位于 -- 之后)

选项

  • --engine <ENGINE> — 要使用的容器引擎(autopodmandocker

    可选值: autopodmandocker

    默认值: auto

  • --from <FROM> — 构建所用的基础镜像引用(使用 --image-dir 时忽略)

  • --image-dir <IMAGE_DIR> — 使用已构建的 OCI 镜像布局,而不是重新构建

  • --include-global — 同时包含全局 / 系统配置中的工具(默认为仅项目配置)

    详见 mise oci build --help

  • --keep — 运行后将加载的镜像保留在引擎的存储中

    默认情况下,命令退出时会同时删除容器(--rm)和已加载的镜像,因此重复调用 mise oci run 不会在 podman / docker 存储中累积镜像。传入 --keep 可使用 mise 所采用的标签保留镜像(docker 使用 mise-oci:run-*;podman 使用拉取的镜像 ID)。

  • --mount-point <MOUNT_POINT> — 覆盖镜像内的挂载点(使用 --image-dir 时忽略)

  • --no-mise — 不嵌入 mise 二进制文件(使用 --image-dir 时忽略)

  • --owner <UID[:GID]> — 构建时为每个 tar 条目分配的 UID[:GID](与 --image-dir 冲突)

    覆盖 [oci].user_id / [oci].group_id。默认为 0:0。如果省略 GID,则默认为 UID。此选项仅影响文件所有权;[oci].user 控制镜像的 USER 指令。

  • --volume <HOST:CONTAINER> — 绑定挂载主机路径(可重复,HOST:CONTAINER[:MODE]

    注意:与 docker run -v 不同,此处没有 -v 短选项,因为 mise 将 -v 保留给 --verbose。请使用 --volume--mount

  • -e --env <KEY=VAL> — 在容器中设置环境变量(可重复,KEY=VAL

  • -i --interactive — 以交互模式运行(向引擎传递 -i

  • -t --tty — 分配 TTY(向引擎传递 -t

  • -w --workdir <WORKDIR> — 容器内的工作目录

  • -h --help — 输出帮助

示例:

构建当前 mise.toml 并进入 bash:
$ mise oci run -it -- bash

运行一个带环境变量 + 卷挂载的一次性命令(注意:`-v` 已保留
给 --verbose,所以请使用 `--volume`):
$ mise oci run -e DEBUG=1 --volume $PWD:/work -w /work -- npm test

复用之前构建的布局(跳过构建步骤):
$ mise oci build -o ./img && mise oci run --image-dir ./img -- node -e 'console.log(process.version)'

引擎:

优先使用 podman(原生加载 OCI 布局)。回退到 docker
(通过 docker load 加载)。传入 --engine podman 或 --engine docker 可覆盖此设置。