簡體   English   中英

Docker 撰寫 mysql 進口.sql

[英]Docker Compose mysql import .sql

我在使用 docker-compose 導入 .sql 轉儲文件時遇到問題。我已經按照文檔進行操作,顯然將從 docker-entrypoint-initdb.d 加載 .sql 文件。 但是,當我運行docker-compose up ,sql 文件不會復制到容器中。

我試過使用-vf標志停止容器,但這也沒有用。 我在 my.yml 腳本中做錯了什么嗎?

我在我的撰寫文件所在的根目錄 database/db-dump/ 中有 dump.sql。

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db
  volumes:
   - ./database/db-dump:/docker-entrypoint-initdb.d

經過多次嘗試卷設置后,我找到了一種解決方法

我在Dockerfile中使用以下內容創建了另一個基於mysql的圖像

FROM mysql:5.6

ADD dump.sql /docker-entrypoint-initdb.d

然后從撰寫中刪除卷並運行新圖像

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mymysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db

這樣,轉儲總是被復制並在啟動時運行

這出現在Docker MySQL圖像的文檔頁面上: https//hub.docker.com/_/mysql/

初始化一個新實例

首次啟動容器時,將創建具有指定名稱的新數據庫,並使用提供的配置變量進行初始化。 此外,它將執行擴展名為.sh.sql.sql.gz文件,這些文件位於/docker-entrypoint-initdb.d中。 文件將按字母順序執行。 您可以通過將SQL轉儲裝入該目錄並使用提供的數據提供自定義映像來輕松填充您的mysql服務。 默認情況下,SQL文件將導入到MYSQL_DATABASE變量指定的數據庫中。

這對我有用,

version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: ecommerce

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

mysql-dump必須是一個目錄。 將導入目錄中的所有.sql。

Mysql數據庫轉儲schema.sql文件是駐留在/mysql-dump/schema.sql目錄和它在初始化過程中創建表。

泊塢窗,compose.yml:

mysql:
    image: mysql:5.7
    command: mysqld --user=root
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

我也有這個問題。 我通過 docker-compose 將包含 init.sql 文件的本地目錄掛載到 docker-entrypoint-initdb.d 卷,該文件將加載到容器中,但在容器初始化時不會執行或填充數據庫. 我的初始 docker-compose.yml 看起來像這樣:

mysqld:
    image: mysql
    container_name: mysqld
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
      - ./init:/docker-entrypoint-initdb.d
    env_file: .env
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=fendou
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
             --default-authentication-plugin=mysql_native_password

但它對我不起作用。 我找到了解決此問題的另一個有效解決方案:將--init-file /data/application/init.sql添加到 mysql command.change 上面的配置,如

mysqld:
    image: mysql
    container_name: mysqld
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
      # - ./init:/docker-entrypoint-initdb.d
    env_file: .env
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=fendou
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
             --default-authentication-plugin=mysql_native_password
             --init-file /docker-entrypoint-initdb.d/init.sql  #attention here

希望對你有幫助

我有一個與mysql類似的問題,我將在/ configs / mysql / data中包含一個mydatabasedump.sql文件的本地目錄通過docker-compose掛載到docker-entrypoint-initdb.d卷,該文件將加載到容器初始化時,不執行或填充數據庫。 我的初始docker-compose.yml喜歡這樣:

#docker-compose.yml
version: '3'
services:
    db:
        build: ./build/mysql/ #this is pointing to my Dockerfile
        container_name: MYSQL_Database
        restart: always
        environment:
        MYSQL_PORT: 3306
        MYSQL_ROOT_PASSWORD: admin
        MYSQL_DATABASE: my_app_database
        MYSQL_USER: admin
        MYSQL_PASSWORD: admin
    volumes:
        - ./configs/mysql/data:/docker-entrypoint-initdb.d:

我找到了兩個解決這個問題的工作方案:

第一個是在我登錄正在運行的容器並確認mydatabasedump.sq文件存在並且在容器的docker-entrypoint-initdb.d目錄中可執行之后。 我創建並在我的local / configs / mysql / data目錄中添加了一個bash腳本,該目錄名為dump.sh,在初始化容器后執行。 它包含一個mysql命令,可將my_database_dump.sql復制到my_app_database。 bash腳本看起來像這樣

    #!/bin/bash
    #dump.sh
    mysql -uadmin -padmin my_app_database < my_database_dump.sql 
    #end of dump.sh

我通過ENTRYPOINT指令中的Dockerfile執行了這個腳本,如下所示:

    #Dockerfile
    FROM mysql:5.5
    ENTRYPOINT [ "dump.sh" ]
    EXPOSE 80
    #end of Dokerfile

在意識到最初的問題是由於在構建cotainer之后對卷進行了調整,因此在啟動時沒有使用轉儲文件(或在該目錄中執行任何腳本)來使用數據庫,第二個解決方案只是移動卷指令在構建指令上面的compose文件中。 這工作,並允許我刪除我的Dockerfile中的dump.sh腳本和DOCKERENTRY指令。 修改后的docker-compose.yml看起來像這樣

#docker-compose.yml
version: '3'
services:
    db:
        volumes:
          - ./configs/mysql/data:/docker-entrypoint-initdb.d
       build: ./build/mysql/ #this is pointing to my Dockerfile
         container_name: MYSQL_Database
         restart: always
     environment:
         MYSQL_PORT: 3306
         MYSQL_ROOT_PASSWORD: admin
         MYSQL_DATABASE: my_app_database
         MYSQL_USER: admin
         MYSQL_PASSWORD: admin

我想保留容器的原始設置,所以我嘗試在已經運行的容器上進行恢復。 這似乎有效:

cat dump.sql | docker-compose exec -T db mysql -h localhost -u root -psomewordpress -v

但它非常慢,冗長的 output 似乎被緩沖了,所以我嘗試了:

docker-compose cp dump.sql db:/tmp/
docker-compose exec db sh -c "mysql -h localhost -u root -psomewordpress -v < /tmp/dump.sql"

這至少提供了更快的反饋。

可能對某人有用? 看起來它很慢,因為我在轉儲上使用了--skip-extended-insert ,沒有擴展插入它運行得更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM