如何使用dockerfile将本地映像用作基础映像?


126

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

所以我想知道:

  • 如何在我的本地(自定义)图像之一不作为索引的FROM情况下将pushing其用作基础()图像?

Answers:


147

您可以使用它而无需执行任何特殊操作。如果您有一个本地图像blah,可以这样做FROM blah。如果您FROM blah在Dockerfile中进行操作,但是没有名为的本地映像blah Docker将尝试从注册表中提取它。

换句话说,如果Dockerfile这样做了FROM ubuntu,但是您有一个ubuntu与官方映像不同的本地映像,则您的映像将覆盖它。


5
对我不起作用-boot2docker可能有问题吗?我拥有最新的版本1.3.1 ... Docker似乎没有首先在本地进行检查(或者可能没有报告),它直接尝试从注册表中退出 stackoverflow.com/q/27046118/202168
Anentropic 2014年

@Anentropic我正在使用boot2docker 1.5。bash-4.3 $ docker images存储库标记映像ID创建的虚拟大小ubuntu1504gcc484最新0378ea1c0b6c 19小时前1.36 GB在我的其他Dockerfile中执行“ FROM ubuntu1504gcc484”,这很好。(为格式不
正确而致歉

我不知道了,我现在也在1.5
Anentropic

1
我创建了一个图像并将其标记为我们的本地注册表。用这种方式标记,它不仅会找到名称,而且全名包括注册表,因此,如果您以这种方式引用,它将在此处获取标记。您可以使用简单的名称形式再次对其进行标记,并且它将在查找注册表之前找到它。为我工作。
格里·格里森

1
不,这是不正确的。尽管我在本地有一个具有相同名称的映像,但Docker仍试图从远程注册表中提取映像docker image list
约翰·史密斯可选

16

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

顺便说一句,--pull=true在运行docker build命令时不要指定:

如果要使用本地图像作为基本图像,请不带选项--pull=true--pull=true将始终尝试拉取该图像的较新版本。

- https://github.com/docker/docker/issues/14943


4
如果您的映像名称中包含-字符(my-image例如),那么您的泊坞窗将不会在本地解析此映像,我不知道为什么,无论如何要修复它,根本不使用-字符,而是在
docker

1
我对上的带连字符的名称没有问题Docker version 17.06.2-ce, build cec0b72,但是请确保如果您标记了图像,则将该标记作为图像规范的一部分包含在内(FROM localimage:tag)。
斯科特(Scott)

@deFreitas似乎是正确的,我有一个名称带有连字符的映像,尽管该名称本地存在,但Docker仍试图从远程注册表中提取它。如果关于名称中的连字符的规则被证实是正确的,那将是纯粹的疯狂。
约翰·史密斯

@deFreitas:在我的最后一条评论之后,我尝试使用下划线连字符,但遇到了相同的问题,尽管本地映像存在,docker仍试图从远程提取映像。就我而言,至少连字符不是问题。
约翰·史密斯可选

4

您可以在图像中包含-字符。假设您有一个名为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

Docker文件

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线程描述了一个类似的问题,即没有按名称查找本地图像

通过省略特定标签,码头工人将查找标记为“最新”的图像,因此可以使用:latest标签创建图像,或更改您的FROM


0

请记住,这样不仅要放置标签,还要放置该标签所在的存储库:

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

您应该以这种方式引用它:

elixir:1.7-centos7_3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.