首页 > 解决方案 > 我在 Docker 中有两个 MariaDb 映像,但是一个配置

问题描述

我使用 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:latest 而不仅仅是 mariadb:dev ?

谢谢你的帮助(我是码头工人的菜鸟,对不起我的英语)

标签: dockerdocker-composedockerfile

解决方案


db:
  build:
    context: ./context
    dockerfile: /path/Dockerfile
  image: mariadb:dev

这告诉 Docker 你想要构建一个镜像并调用它mariadb并将其标记为dev(=mariadb:dev)。

您的 Dockerfile 基于mariadb带有标签latest( FROM mariadb:latest) 的图像。

所以 Docker 首先必须mariadb:latest从 docker hub 拉取。在该步骤之后,此图像位于您的本地注册表中。构建映像 ( mariadb:dev) 后,此映像也在您的本地注册表中。

这就是为什么您在注册表中同时拥有这两者的原因。mariadb:latest是您的图像的基础图像。因此,Docker 必须在 Dockerfile 的第一步中提取该映像。所以它在您的注册表中。

该行为记录在官方Docker 文档中

如果您指定图像和构建,则 Compose 使用 webapp 和图像中指定的可选标签命名构建的图像:

build: ./dir 
image: webapp:tag

这会产生一个名为 webapp 和标记标签的图像,从 ./dir 构建。

我认为您真正想要的是使用mariadb:latestdocker hub 中的图像并将修改后的文件包含为卷,而不是构建新图像。

这看起来像您的以下内容docker-compose.yml(请参阅maria db 图像的文档,了解如何详细使用它):

db:
   image: mariadb:latest
   volumes:
      - "<relativePath>:/var/lib/mysql"
   environment:
      - MYSQL_ROOT_PASSWORD=password

where<relativePath>是从 docker-compose.yml 所在位置/执行docker-compose up. 例如,您可以创建一个子文件夹“mysql”,其中包含要安装到/var/lib/mysql容器内的所有文件,然后使用- "mysql:/var/lib/mysql". (通过使用.,您会将docker-compose.yml同一文件夹/var/lib/mysql内的所有内容安装到容器内)


推荐阅读