Python社区  »  DATABASE

将MySQL数据存储在图像文件中(格式为ext4)

szx • 10 月前 • 79 次点击  

我正试图使用Docker来装载一个MySQL(实际上是Mariadb)数据库。我了解了如何将MySQL数据(/var/lib/mysql)存储在从主机目录装入的卷中。

但是,由于底层文件系统不同于主机,因此存在一些不一致性,例如,在NTFS(Windows)上表名不区分大小写。而且,如果数据库是在Linux主机上创建的,那么它在Windows主机上就不工作(还没有确切地找出原因)。

因此,我希望将数据存储在磁盘映像上,并将其装入容器中,即 db-data.img 格式化为ext4。但我面临着一个奇怪的问题,当把这张图片装进容器时:

$ docker run -v $PWD:/outside --rm -it ubuntu /bin/bash
# dd if=/dev/zero of=/test.img bs=1M count=100
# mkfs.ext4 test.img
# mount -o loop -t ext4 test.img /mnt
mount: /mnt: mount failed: Operation not permitted.

使用另一个目录而不是 /mnt 也没用。

为什么它拒绝挂载img文件?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39032
 
79 次点击  
分享到微博
文章 [ 3 ]  |  最新文章 10 月前
szx
Reply   •   1 楼
szx    1 年前

我通过使用 privileged docker-compose.yml中的选项:

privileged: true

(或) --privileged 在docker命令中)

这是我最后的docker-compose.yml:

version: '3'
services:
  db:
    build: ./db
    image: my_db
    container_name: db
    privileged: true
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
    volumes:
      - ${MYSQL_DATA_IMG}:/data.img
    restart: always

文档文件:

FROM mariadb

COPY my-custom.cnf /etc/mysql/conf.d/custom.cnf

COPY run.sh /usr/local/bin/run-mariadb.sh
ENTRYPOINT ["run-mariadb.sh"]

以及执行的自定义入口点脚本 mount (运行.sh):

#!/bin/sh

# For this mount comamnd to work the DB container must be started
# with --privileged.
mount -o loop /data.img /var/lib/mysql

# Call the entry point script of MariaDB image.
exec /usr/local/bin/docker-entrypoint.sh mysqld
parasit
Reply   •   2 楼
parasit    1 年前

它不会在Docker映像内部工作,Docker会阻止对mouning文件系统(和循环设备)的访问。应该更容易更早地创建这些图像,通过 -v .

另一个选项是将数据库转储到SQL并从Windows还原。

de1
Reply   •   3 楼
de1    1 年前

我建议用 docker-compose 只需使用 docker-compose.yml 配置。

像这样:

version: '3'

services:
    mysql:
        image: mysql
        environment:
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
            MYSQL_USER: $MYSQL_USER
            MYSQL_PASS: $MYSQL_PASSWORD
        volumes:
            - mysql-data:/var/lib/mysql
volumes:
    mysql-data:

这个 mysql-data 卷应存储为独立于主机操作系统的单独卷。不同于仅仅在主机上装载一个目录,它基本上是装载一个卷容器(您也可以在没有卷容器的情况下这样做) Docker撰写 但这是更多的工作)。