Невозможно скопировать каталог данных MariaDB в многоэтапной сборке Docker - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать новый образ Docker из mariadb:10.3.12, который содержит предопределенную схему базы данных 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 на втором этапе не находит те же данные в этом каталоге.

Я проверял полученное изображение Docker, используя Dive , и инструкция COPY, по-видимому, не приводит к выполнению операции.

Inspection result

Может кто-нибудь сказать мне, почему Docker не копирует эти файлы на 2-й этап? Любые советы приветствуются. Спасибо.

1 Ответ

0 голосов
/ 26 января 2019

/var/lib/mysql - объем в изображении mariadb, поэтому данные не сохраняются в изображении.Храните данные в изображении, а не в объеме по умолчанию.Например, выполните:

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

перед импортом и скопируйте данные из /data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...