如何使用本地映像作为dockerfile的基本映像?

我正在处理dockerfile。 我刚刚意识到我一直在使用FROM索引图像

所以我想知道:

  • 我如何使用我的一个本地(自定义)图像作为我的基(FROM)图像而不pushing它的索引?
174725 次浏览

你不用做任何特别的事情就可以使用它。如果你有一个名为blah的本地映像,你可以执行FROM blah。如果你在Dockerfile中执行了FROM blah,但有一个名为blah的本地映像,然后 Docker将尝试从注册表中提取它。

换句话说,如果Dockerfile执行FROM ubuntu,但你有一个名为ubuntu的本地映像,与官方映像不同,你的映像将覆盖它。

已验证:在Docker 1.7.0中运行良好。

运行docker build命令时不要指定--pull=true

在dockerfile中使用FROM引用本地构建的映像上的这个线程:

如果你想使用本地图像作为基图像,不使用 选项--pull=true
--pull=true将总是尝试拉一个更新的

你可以在你的图像中有-字符。假设您有一个名为centos-base-image的本地映像(不是本地注册表),标记为7.3.1611。

docker version
Client:
Version:         1.12.6
API version:     1.24
Package version: docker-common-1.12.6-16.el7.centos.x86_64
Go version:      go1.7.4


Server:
Version:         1.12.6
API version:     1.24
Package version: docker-common-1.12.6-16.el7.centos.x86_64
Go version:      go1.7.4


docker images
REPOSITORY            TAG
centos-base-image     7.3.1611

Dockerfile

FROM centos-base-image:7.3.1611
RUN yum -y install epel-release libaio bc flex

结果

Sending build context to Docker daemon 315.9 MB
Step 1 : FROM centos-base-image:7.3.1611
---> c4d84e86782e
Step 2 : RUN yum -y install epel-release libaio bc flex
---> Running in 36d8abd0dad9
...

在上面的例子中,FROM正在获取你的本地图像,你可以提供额外的指令来从你的自定义注册表(例如FROM localhost:5000/my-image:with.tag)获取图像。参见https://docs.docker.com/engine/reference/commandline/pull/#pull-from-a-different-registryhttps://docs.docker.com/registry/#tldr

最后,如果您的图像在提供名称时没有被解析,请尝试在创建图像时向图像添加标记

这个GitHub线程描述了一个类似的问题,即无法按名称找到本地图像

通过省略一个特定的标签,docker将寻找一个标记为“latest”的图像,所以要么创建一个带有:latest标签的图像,要么改变你的FROM

记住,不仅要放标签,还要放标签所在的存储库,如下所示:

docker images
REPOSITORY                                TAG                       IMAGE ID            CREATED             SIZE
elixir                                    1.7-centos7_3             e15e6bf57262        20 hours ago        925MB

你应该这样引用它:

elixir:1.7-centos7_3

对于将来遇到这个问题的任何人来说,你在本地有映像,但docker build仍然试图从docker hub中提取映像,问题可能是架构类型不同。

Trying to pull from docker. . IO

可以使用以下命令检查映像的体系结构

docker inspect --format='\{\{.Os}}/\{\{.Architecture}}' IMAGE_NAME

现在在你的Dockerfile中,将FROM IMAGE_NAME更改为类似FROM --platform=linux/amd64 IMAGE_NAME的东西,docker现在将使用本地映像。

对于使用M1芯片的用户,当本地镜像与目标Dockerfile的平台不同时,就会出现问题。在我的情况下,我已经建立了M1支持的基本映像,然后尝试在映像中使用命令FROM,该映像正在构建平台linux/amd64

我们的/etc/docker/daemon.json有一行声明

"disable-legacy-registry" : true,

有了这一行,本地注册表拒绝访问。

我刚刚在引擎版本为20.10.14的M1 Mac上遇到了这种情况。从docker build --help中不明显,但传递--pull=false对我有用。

我必须在M1的mac上禁用BUILDKIT才能使用本地映像。 你可以通过将DOCKER_BUILDKIT环境变量设置为0来实现

DOCKER_BUILDKIT=0 docker build -t YOUR_TAG --pull=false .