PAYATHON 2026

Docker SDK for Python 如何为 tmpfs 设置 exec 选项?

数据小陈

tmpfs_mode=0o1777 设置 tmpfs 根目录的权限位,挂载选项 exec 则控制能否从该文件系统执行程序。Docker CLI 将 noexec 和 exec 作为独立的挂载标志,并在文档中列出了默认使用 noexec 的情形。Docker tmpfs 文档

用 tmpfs 参数传递选项

通过 containers.run() 或 containers.create() 创建容器时,可以用 SDK 的 tmpfs 参数将容器内路径映射到选项字符串:

import docker

client = docker.from_env()

container = client.containers.run(
    "python:3.12-slim",
    command="sleep infinity",
    detach=True,
    tmpfs={"/work": "rw,exec,size=64m,mode=1777"},
)

选项字符串以逗号分隔,格式与 Docker --tmpfs 支持的挂载选项一致。要禁用执行,可以使用 noexec:

tmpfs={"/work": "rw,noexec,size=64m,mode=1777"}

Docker 文档列出了 exec、noexec、size 和 mode 等 tmpfs 选项。此功能仅适用于运行在 Linux 上的 Docker。Docker tmpfs 选项

使用 Mount 和 Engine API 的 Options

docker.types.Mount 提供 tmpfs_size 和 tmpfs_mode 参数,但没有单独设置 tmpfs 挂载选项的参数。较新版本的 Docker Engine API 在 TmpfsOptions 中增加了 Options 字段,可以通过挂载对象的字典内容传递该字段:docker-py Mount 实现、Engine API 版本历史。

from docker.types import Mount

mount = Mount(
    target="/work",
    source="",
    type="tmpfs",
    tmpfs_size=64 * 1024 * 1024,
    tmpfs_mode=0o1777,
)
mount["TmpfsOptions"]["Options"] = ["exec"]

container = client.containers.run(
    "python:3.12-slim",
    command="sleep infinity",
    detach=True,
    mounts=[mount],
)

这种写法要求 Docker Engine 支持 HostConfig.Mounts.TmpfsOptions.Options。如果服务端 API 版本不支持该字段,可以改用上一节的 tmpfs 参数,或升级并确认客户端与 Engine API 兼容。Mount 类的参数和序列化方式可能随 docker-py 版本变化,使用前请对照所安装版本的文档。

tmpfs_mode 为什么不等同于 exec

tmpfs_mode 设置挂载目录的 Unix 权限模式。例如,0o1777 表示目录对所有用户可读、可写、可访问。挂载选项 exec 控制是否允许从该文件系统执行程序。即使目录权限允许访问,noexec 挂载标志仍会阻止从该挂载点执行程序;启用 exec 也不会自动为文件添加执行权限。

备注:内容仅供参考。