繁体   English   中英

docker-compose 卷问题和错误 -- 指定了初始化,但数据目录中有文件。 中止

[英]docker-compose volume question and error --initialize specified but the data directory has files in it. Aborting

我有一个使用 mysql docker-image 的 spring-boot 项目,所以我不需要下载 mysql 基准工作。 由于其他原因,我不得不重新开始,所以我创建了一个新项目,该项目使用我之前使用的相同 mysql docker 图像。 我的 docker-compose.yml mysql 服务看起来像这样

version: "3.7"

services:

  db:
    image: mysql:5.7
    command: --lower_case_table_names=1
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: farming_db
      MYSQL_USER: root
      MYSQL_PASSWORD: root
    restart: always
    volumes:
      - "./database/farming_db/:/var/lib/mysql" #local
      - farming_db:/var/lib/mysql/data #docker
    ports:
      - "3306:3306"
    container_name: farming_mysql
    networks:
      - backend-network


当我运行docker-compose up这是错误:

Attaching to farming_mysql, farming_server_springboot_1
farming_mysql | 2021-03-18 07:03:20+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
farming_mysql | 2021-03-18 07:03:20+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
farming_mysql | 2021-03-18 07:03:20+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
farming_mysql | 2021-03-18 07:03:21+00:00 [Note] [Entrypoint]: Initializing database files
farming_mysql | 2021-03-18T07:03:21.058436Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server opti
on (see documentation for more details).
farming_mysql | 2021-03-18T07:03:21.063630Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
farming_mysql | 2021-03-18T07:03:21.063710Z 0 [ERROR] Aborting
farming_mysql |
farming_mysql exited with code 1
springboot_1  |

我知道我的目录不是空的。 我正在尝试将“./database/farming_db/:/var/lib/mysql”和“farming_db:/var/lib/mysql/data”都用作卷目录。 我认为问题出在后一个目录上,因为前一个目录是空的。 我在删除后一个目录中的内容时遇到问题,因为我不知道如何访问它。

所以这就是我尝试过的:

  1. 我删除了所有容器,然后删除了所有卷。 docker volume prune但没有用。

  2. 我搜索了我可以执行rm -rf /usr/local/var/mysql但我不知道在哪里可以执行此命令,因为容器根本无法正常运行。

  3. 我删除了 mysql 映像,然后再次运行docker-compose up 这似乎从某个地方拉了一个新的 mysql 图像? 但我仍然得到同样的错误。 我猜卷目录与 docker 映像本身无关。

  4. 我从 docker-compose 中删除了“-farming_db:/var/lib/mysql/data #docker”行。 但同样的错误仍在发生!

我正在使用Windows10。

我的问题:

  1. 如何访问目录? 我不知道在哪里使用 rm -rf 命令。
  2. 为什么即使我从 docker-compose 中删除“-farming_db:/var/lib/mysql/data #docker”,仍然会出现此错误?
  3. 还有谁能解释我在做什么? 我是 docker 的新手,我不太了解这些音量问题。

此行表明 mysql 容器将数据存储在与docker-compose.yml相同的目录中的目录database中:

    volumes:
      - "./database/farming_db/:/var/lib/mysql" #local

这种卷不是由 Docker 管理的,它只是文件系统中的一个目录,这就是docker volume prune不起作用的原因。 我知道,因为它以相对或绝对的“路径”开头。

另一个卷, farming_db ,由 Docker 管理。 我知道,因为它以一个简单的名称开头。 这种卷由 Docker 管理并用prune删除。

所以,回答:

  1. 在与docker-compose.yml相同的目录中,您可以删除该database文件夹。
  2. 因为第一个卷,带有/var/lib/mysql的那个仍然存在。 MySQL 将所有文件保存在此目录中,任何其他子目录都是数据库。
  3. 你只是想让一个容器运行,而docker-compose隐藏了很多细节。
  4. 这只是一个细节,但MYSQL_USER应该不同于root

您可以让 Docker 管理整个卷,创建一个单独的卷来保存所有数据,在这种情况下,我将其命名为mysql_data

    volumes:
    - mysql_data:/var/lib/mysql

或者,您可以进一步探索docker run等效命令来使用它:

docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=farming_db \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=mypass \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 \
mysql:5.7

运行docker system prune --volumes

这通过删除所有未使用的容器来释放 memory。 有时,由于 memory 限制,可能会出现上述问题

一般来说,我清空了卷的数据目录,只是更改了 MySQL 的版本。 所以分步骤:

  1. 空卷目录内容
  1. 将 docker-compose.yml mysql 版本从 5.7 修改为 5.7.16

作为 vencedor 的回答,它对我有用。 如果有人需要使用 mysql 5.7,您可以在 docker-compose.yml 中将这些行添加到您的数据库服务中:

 - /etc/group:/etc/group:ro
 - /etc/passwd:/etc/passwd:ro
user: "1000:1000"

我使用 docker-compose 运行 mysql 映像并遇到错误。 我使用以下配置来设置音量。 -./mysql/data:/var/lib/mysql/data

然后我把它改成下面的,错误就解决了。 -./mysql:/var/lib/mysql

我在我的 Windows 系统上发现,虽然我的本地卷 (ie/db) 看起来是空的,但实际上并非如此。 我最终从 bash shell 运行ls -la在它显示一个 .sock 文件的同一文件夹中。 一旦我删除( rm -f *.sock )并运行docker-compose up --build它似乎正确安装了卷。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM