14

使用Laradock

系统信息:

  • Docker 版本:17.10.0-ce,构建 f4ffd25
  • 操作系统:Windows 10 家庭版

当我运行时docker-compose up -d mysql出现错误。以下是码头工人日志

[注意] Basedir 设置为 /usr/

[警告] 语法 '--symbolic-links/-s' 已弃用,将在未来版本中删除

[警告] 'NO_ZERO_DATE'、'NO_ZERO_IN_DATE' 和 'ERROR_FOR_DIVISION_BY_ZERO' sql 模式应与严格模式一起使用。它们将在未来的版本中与严格模式合并。

[错误] --initialize 已指定,但数据目录中有文件。中止。

[错误] 中止

我试过删除mysql下面的文件夹~/.laradock\data但没有用。

更新 1

laradock Dockerfile 下的 MySQL Container

mysql:
  build:
    context: ./mysql
    args:
      - MYSQL_VERSION=${MYSQL_VERSION}
  environment:
    - MYSQL_DATABASE=${MYSQL_DATABASE}
    - MYSQL_USER=${MYSQL_USER}
    - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    - TZ=${WORKSPACE_TIMEZONE}
  volumes:
    - ${DATA_SAVE_PATH}/mysql:/var/lib/mysql
    - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
  ports:
    - "${MYSQL_PORT}:3306"
  networks:
    - backend

MySQL Docker 文件

ARG MYSQL_VERSION=8.0
FROM mysql:${MYSQL_VERSION}

MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>

#####################################
# Set Timezone
#####################################

ARG TZ=UTC
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN chown -R mysql:root /var/lib/mysql/

ADD my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

EXPOSE 3306

更新 2

在我删除mysql文件夹后,~/.laradock/data我收到以下错误。在命令之后,它会生成下图中的文件。当我重新运行时,返回上面提到的先前错误。

[注意] Basedir 设置为 /usr/

[警告] 语法 '--symbolic-links/-s' 已弃用,将在未来版本中删除

[警告] 'NO_ZERO_DATE'、'NO_ZERO_IN_DATE' 和 'ERROR_FOR_DIVISION_BY_ZERO' sql 模式应与严格模式一起使用。它们将在未来的版本中与严格模式合并。

[警告] 设置 lower_case_table_names=2 因为 /var/lib/mysql/ 的文件系统不区分大小写

[警告] 您需要使用 --log-bin 来使 --log-slave-updates 工作。

libnuma:警告:/sys 未安装或无效。假设一个节点:没有这样的文件或目录 mbind:不允许操作

[错误] InnoDB:文件操作中的操作系统错误号 22。

[错误] InnoDB:错误号 22 表示“无效参数”

[错误] InnoDB:文件 ./ib_logfile101:“aio write”返回操作系统错误 122。无法继续操作

[错误] InnoDB:无法继续操作。

在此处输入图像描述

** 我尝试在 Windows 7 机器上运行。

4

4 回答 4

38

禁用 AIO

当我从 Virtualbox 的来宾 Debian 操作系统启动容器并在 Windows 10 的共享文件夹上创建数据库文件时遇到 AIO 错误时,这为我修复了它。

问题似乎是共享文件夹不支持 AIO,或者至少在某些版本的 Windows 上不支持。在我的主机崩溃后,我从 Windows 10 Pro 移至 Home 后,似乎发生了这种情况。

详情:

以下是一些选项:

选项 1 - 像这样启动容器:

docker run -it mysql --innodb_use_native_aio=0

选项 2 - 将命令添加到您的 docker-compose 文件中:

 command: --innodb_use_native_aio=0

在上下文中,这是我工作的 docker-compose.yml 的相关部分:

services:
   db:
     image: ${MYSQL_IMAGE}
     command: "--innodb_use_native_aio=0"
     volumes:
       - ${DB_DATA_PATH}:/var/lib/mysql
     ports:
        - ${MYSQL_PORT}:3306

选项 3 - 在构建中的 my.cnf 文件中添加一个选项

innodb_use_native_aio=0

选项 4 - 不要将您的数据库保存在本地文件系统上。(可能会破坏您的数据库,不推荐)

只需删除包含 mysql 数据库的 docker 配置中的卷。当然,如果您执行 docker-compose down 或以其他方式破坏您的容器,您的数据库将被删除,所以就是这样。

于 2018-02-05T21:38:35.333 回答
2

我不确定,但试试这个步骤。这是因为数据文件夹。

尝试删除泊坞窗图像。使用 docker images列出所有图像,然后使用 docker rmi imagename删除 mysql 和 laradock mysql 。不要忘记使用docker volume rm volumename删除 docker 卷 也去cd ~/.laradock/data删除 mysql 文件夹。

然后尝试docker-compose up mysql进行调试。如果没有错误,您可以尝试docker-compose up -d mysql

于 2018-01-13T12:18:58.530 回答
2

我的 Windows 10 企业版遇到了同样的问题,我找不到完美的解决方案,因为这似乎是我的 Windows 版本问题 - 我已经在其他 Windows(8 和 10 专业版)上成功运行了相同的图像。我的临时工作是从 docker-compose 文件中完全删除 /var/lib/mysql 挂载,从而允许在容器本身中创建和修改数据库数据文件。

我使用 kitematics 将在我想在容器上工作的任何时候重新启动并重新附加我创建的容器,就像容器退出时我不会丢失我的数据一样。如果你不使用风筝学,它就是这样做的。运行 docker-compose 后,将创建映像并创建一个容器来运行它,我避免在创建的映像上使用 run,因为这将创建新容器,我坚持按顺序运行以下命令

docker ps -a                 # this command will get container_id of all container, those that are running and those that are not
docker start <container_id>  # start container from background
docker attach <container_id> # attach container to standard input

使用这些 docker 命令,即使在退出并重新启动后,我的数据也保留在容器中

备份

现在每当我想移动数据时,我都会将我的容器提交到一个图像中并将图像保存到本地存储中

docker commit <container_id> <backup_image_name>:<1_31_2017> # I use date to tag it
docker save -o <local_storage_tar_name> <backup_image_name>

恢复

每当我需要在我的计算机上或为新的编程实习生恢复 mysql 容器时

cd <dir_containing_the_tar_file>
docker load -o <local_storage_tar_name> 

此解决方案适用于您的更新

 File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation

我希望这可以帮助某人

于 2018-01-31T10:31:42.190 回答
0

除了AndrewD的上述响应之外,您还应该更改权限,my.cnf以便在启动时不会被忽略。您可以运行以下命令,

sudo chmod 400 my.cnf

在跑步之前做这件事docker-compose up -d

于 2019-08-02T20:46:35.110 回答