我使用docker-compose构建了一个配置:
db: build: context: ./context dockerfile: /path/Dockerfile image: mariadb:dev
在Dockerfile中:
FROM mariadb:latest MAINTAINER Billy COPY ./ /var/lib/mysql
在启动docker-compose up之后,我有:
REPOSITORY TAG mariadb dev mariadb latest
为什么我有一个镜像mariadb:最新的,而不仅仅是mariadb:dev?
谢谢你的帮助(我是码头新手,我的英语很抱歉)
发布于 2019-03-24 21:47:28
db:
build:
context: ./context
dockerfile: /path/Dockerfile
image: mariadb:dev这告诉Docker您希望构建一个镜像并将其命名为mariadb,并将其标记为dev (=mariadb:dev)。
您的Dockerfile文件基于带有标签latest (FROM mariadb:latest)的镜像mariadb。
因此,Docker首先必须从docker集线器中拉出mariadb:latest。在此步骤之后,此映像将保存在您的本地注册表中。构建映像(mariadb:dev)后,此映像也在本地注册表中。
这就是为什么你在你的注册表中有这两个。mariadb:latest是您的镜像的基础镜像。因此,Docker必须在Dockerfile的第一步中提取该镜像。所以它就在你的注册表里。
官方的Docker docs中记录了这种行为
如果既指定映像又指定构建,则Compose将使用webapp和在image中指定的可选标记来命名构建的映像:
build: ./dir
image: webapp:tag这将产生一个名为webapp和标签标签的图像,它是从./dir构建的。
我认为您真正想要的是使用docker集线器中的mariadb:latest镜像,并将修改后的文件作为卷包含进来,而不是构建新的镜像。
这看起来类似于您的docker-compose.yml中的以下内容(有关如何使用它的详细信息,请参阅docs of the maria db image ):
db:
image: mariadb:latest
volumes:
- "<relativePath>:/var/lib/mysql"
environment:
- MYSQL_ROOT_PASSWORD=password其中,<relativePath>是相对于您的docker-compose.yml所在位置/执行docker-compose up的位置的相对路径。例如,您可以创建一个子文件夹"mysql“,其中包含您希望在容器内挂载到/var/lib/mysql的所有文件,然后使用- "mysql:/var/lib/mysql"。(通过使用.,您将把docker-compose.yml和同一文件夹中的所有内容挂载到容器内的/var/lib/mysql中)
发布于 2019-03-25 00:07:07
您拥有这两个图像,因为mariadb:latest是您的自定义图像的中间图像-在执行您的两个定制层(分别为MANTAINER和COPY )之前,必须具有它。
将您的自定义图像视为一堆图像:
mariadb:latest镜像(我假设)首先堆叠MANTAINER中间层(MANTAINER Billy)然后是COPY ./ /var/lib/mysql)最后是然后,docker创建一个标记(mariadb:dev)并将其指向新创建的图像。
因此,更具体地说,Docker需要在其本地缓存中具有mariadb:latest,以便能够构建您的镜像。
您可以在the official Docker documentation中找到有关这方面的更多信息。
https://stackoverflow.com/questions/55324374
复制相似问题