[英]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.