gpt4 book ai didi

linux - 无法在多阶段 Docker 构建中复制 MariaDB 数据目录

转载 作者:太空狗 更新时间:2023-10-29 12:22:45 26 4
gpt4 key购买 nike

我正在尝试从 mariadb:10.3.12 创建一个新的 Docker 镜像,它包含一个预定义的数据库模式 collectives 和该模式中的一些预填充的数据库表。

我的 Dockerfile 确实声明了两个阶段:

  1. 第一阶段是构建阶段,负责创建模式 collectives 并将数据导入该模式。
  2. 然后第二阶段应该简单地复制第一阶段的数据目录。因此,它是一个预初始化的 MariaDB Docker 镜像。

这就是 Dockerfile 的样子:

FROM mariadb:10.3.12 as builder

ENV MYSQL_ROOT_PASSWORD=abc
ENV MYSQL_DATABASE=collectives
ENV MYSQL_USER=abc
ENV MYSQL_PASSWORD=abc

ADD server.jar app.jar
ADD openjdk-11.0.2_linux-x64_bin.tar.gz /usr/lib/jvm
ADD import.sh import.sh

RUN chmod +x import.sh && ./import.sh

FROM mariadb:10.3.12

ENV MYSQL_DATABASE=collectives
ENV MYSQL_USER=abc
ENV MYSQL_PASSWORD=abc

COPY --from=builder /var/lib/mysql /var/lib/mysql

EXPOSE 3306

ENTRYPOINT ["./docker-entrypoint.sh", "mysqld", "--collation-server=utf8mb4_unicode_ci", "--character-set-server=utf8mb4", "--innodb-flush-log-at-trx-commit=0"]

当我使用

构建 Dockerfile
docker build -t huhu .

第一个 builder 阶段的一切都按预期工作。表示 MariaDB 启动。然后它创建模式 collectives。数据由 import.sh 脚本导入。

import.sh 中,我添加了调试命令 tree/var/lib/mysql,它列出了 /var/lib/mysql< 的内容 到控制台。命令的结果是:

/var/lib/mysql
|-- aria_log.00000001
|-- aria_log_control
|-- collectives
| |-- collective_partner.frm
| |-- collective_partner.ibd
| |-- db.opt
| |-- flyway_schema_history.frm
| |-- flyway_schema_history.ibd
| |-- price_record.frm
| `-- price_record.ibd
|-- ib_buffer_pool
|-- ib_logfile0
|-- ib_logfile1
|-- ibdata1
|-- multi-master.info
|-- mysql
| |-- column_stats.MYD
| |-- column_stats.MYI
| |-- column_stats.frm
| |-- columns_priv.MYD
| |-- columns_priv.MYI
| |-- columns_priv.frm
| |-- db.MYD
| |-- db.MYI
| |-- db.frm
| |-- event.MYD
| |-- event.MYI
| |-- event.frm
| |-- func.MYD
| |-- func.MYI
| |-- func.frm
| |-- general_log.CSM
| |-- general_log.CSV
| |-- general_log.frm
| |-- gtid_slave_pos.frm
| |-- gtid_slave_pos.ibd
| |-- help_category.MYD
| |-- help_category.MYI
| |-- help_category.frm
| |-- help_keyword.MYD
| |-- help_keyword.MYI
| |-- help_keyword.frm
| |-- help_relation.MYD
| |-- help_relation.MYI
| |-- help_relation.frm
| |-- help_topic.MYD
| |-- help_topic.MYI
| |-- help_topic.frm
| |-- host.MYD
| |-- host.MYI
| |-- host.frm
| |-- index_stats.MYD
| |-- index_stats.MYI
| |-- index_stats.frm
| |-- innodb_index_stats.frm
| |-- innodb_index_stats.ibd
| |-- innodb_table_stats.frm
| |-- innodb_table_stats.ibd
| |-- plugin.MYD
| |-- plugin.MYI
| |-- plugin.frm
| |-- proc.MYD
| |-- proc.MYI
| |-- proc.frm
| |-- procs_priv.MYD
| |-- procs_priv.MYI
| |-- procs_priv.frm
| |-- proxies_priv.MYD
| |-- proxies_priv.MYI
| |-- proxies_priv.frm
| |-- roles_mapping.MYD
| |-- roles_mapping.MYI
| |-- roles_mapping.frm
| |-- servers.MYD
| |-- servers.MYI
| |-- servers.frm
| |-- slow_log.CSM
| |-- slow_log.CSV
| |-- slow_log.frm
| |-- table_stats.MYD
| |-- table_stats.MYI
| |-- table_stats.frm
| |-- tables_priv.MYD
| |-- tables_priv.MYI
| |-- tables_priv.frm
| |-- time_zone.MYD
| |-- time_zone.MYI
| |-- time_zone.frm
| |-- time_zone_leap_second.MYD
| |-- time_zone_leap_second.MYI
| |-- time_zone_leap_second.frm
| |-- time_zone_name.MYD
| |-- time_zone_name.MYI
| |-- time_zone_name.frm
| |-- time_zone_transition.MYD
| |-- time_zone_transition.MYI
| |-- time_zone_transition.frm
| |-- time_zone_transition_type.MYD
| |-- time_zone_transition_type.MYI
| |-- time_zone_transition_type.frm
| |-- transaction_registry.frm
| |-- transaction_registry.ibd
| |-- user.MYD
| |-- user.MYI
| `-- user.frm
`-- performance_schema
`-- db.opt

所以正如您在第一阶段看到的那样,一切都在那里。但是第二阶段的COPY --from=builder/var/lib/mysql/var/lib/mysql 似乎没有在该目录中找到相同的数据。

我正在使用 Dive 检查结果 Docker 镜像COPY 指令似乎导致无操作步骤。

Inspection result

谁能告诉我为什么 Docker 不将这些文件复制到第二阶段?任何提示表示赞赏。谢谢。

最佳答案

/var/lib/mysql 是 mariadb 镜像中的一个卷,所以数据不存储在镜像中。将数据存储在图像中,而不是默认卷中。例如运行:

mkdir /data && sed -i -e "s#/var/lib/mysql#/data#g" /etc/mysql/my.cnf

在从 /data 导入和复制数据之前。

关于linux - 无法在多阶段 Docker 构建中复制 MariaDB 数据目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54361657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com