【问题标题】:How can I tell docker to create a container from a local image, without looking at the docker hub if no local image is found with that name?如果没有找到具有该名称的本地图像,我如何告诉 docker 从本地图像创建容器,而不查看 docker 集线器?
【发布时间】:2022-01-16 18:37:31
【问题描述】:
我正在尝试解决我认为的安全问题。如果我正在处理一个我称之为“示例”的项目,我可以使用docker build -t example . 从它构建一个 docker 映像,然后使用docker run example 运行它。这将正常工作,但如果我忘记先构建,或者如果我 docker rmi 没有重新构建映像,那么 docker 将查询 docker hub,并改为运行该映像。
对于我已经知道的图像,我信任 docker hub(例如,我很乐意运行 docker run nginx 或 docker run postgres),但如果我忘记运行,我担心会意外运行任意远程图像构建我的本地 docker 镜像。
我知道我可以为我的本地图像命名一些深奥的东西,这样就不太可能发生冲突,但这感觉就像默默无闻的安全。
【问题讨论】:
标签:
docker
security
dockerfile
docker-registry
【解决方案1】:
您不必为您的图像命名一些深奥的东西。
使用命名空间
只需在 docker hub 上注册一个命名空间,然后在你的镜像名称中使用它。例如,我是 Docker Hub 上的 larsks。除了我之外,没有人可以在 larsks 命名空间中创建映像,所以如果我将本地映像命名为 larsks/example,我知道除非我把它放在那里,否则它永远不会在 Docker Hub 上解决。
使用虚假的注册表名称
也许您不想注册 Docker Hub。
回想一下,图像名称的完全限定形式是registry/namespace/repository:tag。如果您使用不存在的注册表命名本地映像,Docker 将无法从任何地方拉取它们。例如,如果我将某个东西命名为 dne/larsks/example(dne 在“不存在”中,但任何不是有效主机名的东西都可以工作),Docker 将永远无法提取此图像。
【解决方案2】:
使用您控制的注册表或存储库命名您的图像。换句话说,不要运行:
docker build -t example .
因为它会扩展到您无法控制的 Docker 官方映像存储库(又名 docker.io/library/)。但您可以在 Hub 上创建自己的用户帐户,从而:
docker build -t ${your_hub_id}/example .
因此,任何本地不存在的图像都会尝试从 Hub 上的命名空间中提取。