【问题标题】: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 nginxdocker 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/exampledne 在“不存在”中,但任何不是有效主机名的东西都可以工作),Docker 将永远无法提取此图像。

    【讨论】:

    • 感谢您的详尽回答,您的两个建议都非常有意义。
    【解决方案2】:

    使用您控制的注册表或存储库命名您的图像。换句话说,不要运行:

    docker build -t example .
    

    因为它会扩展到您无法控制的 Docker 官方映像存储库(又名 docker.io/library/)。但您可以在 Hub 上创建自己的用户帐户,从而:

    docker build -t ${your_hub_id}/example .
    

    因此,任何本地不存在的图像都会尝试从 Hub 上的命名空间中提取。

    【讨论】:

    • 感谢您的回答 - 看起来是完美的解决方案。
    猜你喜欢
    • 2018-09-14
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多