Docker:MariaDB / MySQL 在 Windows 主机上启动失败

问题描述 投票:0回答:3

我正在尝试使用官方 mariadb docker 映像以及 php-fpm 和 nginx 来运行我的 Symfony 2 应用程序。

这个想法是将所有数据库文件保存在已安装的文件夹中。在 Mac OS 上它工作得很好 - 在 Windows 机器上,每次 MariaDB 尝试启动时我都会收到错误。奇怪的是它实际上能够创建一些文件 - 我可以看到 ibdata1 文件,但它的大小是 0 字节。还有两个 aria_log 文件,数据只有几 KB,这意味着 mysql 实际上可以在那里写入。

  • 我正在使用
    docker for windows 1.12.2 beta
    。但也尝试过稳定的。
  • 我存储项目的 Windows 磁盘是共享的(通过 Docker for Windows UI 的“共享驱动器”部分)
  • 该目录是 100% 可写的,因为 nginx 甚至 mysql 本身都可以将日志放在那里
  • 我完全没有像日志所示的那样“磁盘空间不足”

这是我的 docker-compose 文件:

version: '2'
services:
db:
    image: mariadb
    ports:
        - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: test
        MYSQL_USER: root
        MYSQL_PASSWORD: root
    volumes:
        - ./docker-runtime/mysql:/var/lib/mysql
php:
    build: ./docker/php-fpm
    volumes:
        - ./:/var/www/symfony
        - ./docker-runtime/logs/symfony:/var/www/symfony/app/logs
    links:
        - db
nginx:
    build: ./docker/nginx
    ports:
        - "80:80"
    links:
        - php
    volumes_from:
        - php
    volumes:
        - ./docker-runtime/logs/nginx/:/var/log/nginx

这是我这样做时日志所说的内容

docker-compose up

db_1     | 2016-10-18 13:14:06 7f79eed7f7c0 InnoDB: Error: Write to file ./ibdata1 failed at offset 0.
db_1     | InnoDB: 1048576 bytes should have been written, only 0 were written.
db_1     | InnoDB: Operating system error number 22.
db_1     | InnoDB: Check that your OS and file system support files of this size.
db_1     | InnoDB: Check also that the disk is not full or a disk quota exceeded.
db_1     | InnoDB: Error number 22 means 'Invalid argument'.
db_1     | InnoDB: Some operating system error numbers are described at
db_1     | InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] InnoDB: Error in creating ./ibdata1: probably out of disk space
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] Plugin 'InnoDB' init function returned error.
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] Unknown/unsupported storage engine: InnoDB
db_1     | 2016-10-18 13:14:06 140161674901440 [ERROR] Aborting

我真的很感激关于这个问题的任何想法,因为我目前正处于抓狂的阶段

docker mariadb docker-compose
3个回答
10
投票

启动 MariaDB 时需要添加此选项(在 Dockerfile 的

CMD
或 docker-compose
command:
中):

--innodb-flush-method=fsync

记录在这里:https://github.com/docker-library/mariadb/issues/95

如果没有帮助,还添加

--innodb-use-native-aio=0

Windows 和 Mac OS X 均不支持异步 I/O:
https://dev.mysql.com/doc/refman/8.0/en/innodb-linux-native-aio.html


8
投票

可能您遇到权限问题。要放弃更改 docker-compose.yml 以使用命名卷:

version: '2'
services:
db:
    image: mariadb
    ports:
        - "3306:3306"
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: test
        MYSQL_USER: root
        MYSQL_PASSWORD: root
    volumes:
        - mysql:/var/lib/mysql
php:
    build: ./docker/php-fpm
    volumes:
        - ./:/var/www/symfony
        - ./docker-runtime/logs/symfony:/var/www/symfony/app/logs
    links:
        - db
nginx:
    build: ./docker/nginx
    ports:
        - "80:80"
    links:
        - php
    volumes_from:
        - php
    volumes:
        - ./docker-runtime/logs/nginx/:/var/log/nginx
volumes:
  mysql:

尝试看看 mysql 错误是否消失。

问候


0
投票

我使用 docker hub 中的官方 docker 映像来运行 Azure 容器实例,并在 Azure 存储帐户中安装了 azure 文件共享。

从标签 mysql:8.4.0 / LTS 开始,这不会使用初始 innodb 数据库文件初始化空文件共享,两个除外。 “ibdata1”和“auto.cnf”。

我得到以下日志输出:

[错误] InnoDB:写入文件 ./ibdata1 在偏移量 0、1048576 处失败 应该已写入字节,但只写入了 0。操作系统 错误号 22。检查您的操作系统和文件系统是否支持以下文件 这个尺寸。另请检查磁盘未满或磁盘配额 超出了。

为了解决这个问题,我在自定义 db.cnf 文件中添加了以下 innodb 选项,并将其与 docker 文件一起添加到“/docker-entrypoint-initdb.d”目录中。

[mysqld]
# Make Azure file working as a mounted volume for the Container Instance
innodb_flush_method=fsync

并且 - 它有效:-) 它不仅适用于版本 8.4.0 (LTS),甚至适用于版本 9.1.0。

非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.