You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从导出的Docker镜像文件安装托管式Docker(网络)插件?

问题

我通过以下步骤创建了Docker托管(网络)插件(环境变量值不影响问题):

PLUGINNAME=foo
LOCAL_REGISTRY_PORT=11500

PLUGIN_IMAGE=localhost:${LOCAL_REGISTRY_PORT}/${PLUGINNAME}
PLUGIN_EXPORT=${PLUGINNAME}-plugin.tar.gz

# 构建插件(中间)镜像
docker build -t ${PLUGINNAME}-plugin -f build/Dockerfile .

# 导出插件rootfs
id=$(docker create ${PLUGINNAME}-plugin true)
sudo rm -rf plugin/rootfs
sudo mkdir -p plugin/rootfs
sudo docker export "$id" | sudo tar -x -C plugin/rootfs
docker rm -vf "$id"

# 启动本地v2镜像仓库
docker plugin rm -f ${PLUGIN_IMAGE} 2>/dev/null || true
docker plugin create ${PLUGIN_IMAGE} 2>/dev/null ./plugin
docker container stop registry 2>/dev/null || true
docker container rm -v registry 2>/dev/null || true
docker run -d -p ${LOCAL_REGISTRY_PORT}:5000 --restart=always --name registry registry:2 2>/dev/null
wget --quiet --waitretry=1 --tries=10 --retry-connrefused -O /dev/null http://localhost:${LOCAL_REGISTRY_PORT}/ 1>/dev/null

# 将插件推送到本地仓库
docker plugin push ${PLUGIN_IMAGE}

# 导出插件镜像
skopeo copy --src-tls-verify=false docker://${PLUGIN_IMAGE} docker-archive:${PLUGIN_EXPORT}

最终我得到了foo-plugin.tar.gz镜像文件。

请问能否直接从这个导出的镜像文件安装托管式Docker插件?我尝试导入该镜像文件后执行docker plugin install foo-plugin:latest --alias foo,但该操作始终尝试从远程注册表拉取而不使用本地导入的镜像。如何在无需注册表的情况下实现此功能?

注意:docker plugin create需要本地解压的rootfs及config.json,由于我需要在大量Docker主机上部署安装/拉取插件,因此希望完全避免使用docker plugin create,而是坚持使用docker plugin install ...命令。


解决方案

可以实现,核心是先把插件归档文件加载到Docker本地插件存储,再通过指定本地镜像引用执行安装,步骤如下:

  1. 用skopeo将插件归档导入本地Docker守护进程
    Docker CLI本身没有直接导入插件归档的命令,需要借助skopeo完成这一步,它能把归档里的插件镜像直接写入本地Docker的存储中:
skopeo copy --dest-tls-verify=false docker-archive:foo-plugin.tar.gz docker-daemon:foo-plugin:latest

执行完这条命令后,本地Docker就已经存储了foo-plugin:latest这个插件镜像,不需要依赖任何注册表。

  1. 执行本地插件安装
    安装时必须明确指定本地镜像的完整引用,同时关闭内容信任(因为本地镜像没有签名),避免Docker去远程注册表拉取:
docker plugin install --alias foo foo-plugin:latest --disable-content-trust

如果之前尝试安装过同名插件导致冲突,可以先执行docker plugin rm -f foo-plugin:latest清理后再重新安装。

为什么之前的尝试失败?

你之前的操作只导入了归档,但Docker的plugin install命令默认会优先去配置的远程注册表拉取镜像,哪怕本地存在同名镜像——除非你明确告诉它使用本地存储的镜像。而skopeo copy到docker-daemon的操作,是把插件镜像真正写入了Docker的本地插件存储池,此时执行install时指定正确的本地镜像标签,Docker就会直接使用本地资源。

批量部署建议

在大量Docker主机上部署时,只需要:

  • 将foo-plugin.tar.gz分发到所有目标主机(比如用scp、Ansible等工具)
  • 在每个主机上依次执行上述skopeo copy和docker plugin install命令
    全程不需要依赖任何私有或公共注册表,完全离线完成部署。

内容的提问来源于stack exchange,提问作者TheDiveO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:45:43