簡體   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