社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

szx • 6 年前 • 1400 次点击  

我正试图使用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
 
1400 次点击  
文章 [ 3 ]  |  最新文章 6 年前
szx
Reply   •   1 楼
szx    6 年前

我通过使用 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    6 年前

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

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

de1
Reply   •   3 楼
de1    6 年前

我建议用 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撰写 但这是更多的工作)。