docker cpでMySQLダンプをコンテナに送ってリストアする

  • Docker
  • MySQL

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

Dockerコンテナで動いてるMySQLにダンプファイルをリストアする時の手順。

コンテナ名を確認する

docker compose ps で対象のDBコンテナ名を確認する。

$ docker compose ps
NAME COMMAND SERVICE STATUS PORTS
myapp-app-1 "/usr/sbin/apachectl…" app running 0.0.0.0:8081->80/tcp
myapp-db-1 "docker-entrypoint.s…" db running 3306/tcp

ダンプファイルをコンテナにコピーする

$ docker cp app.dump.sql myapp-db-1:/tmp/

コンテナ名は前項で確認したもの。

コンテナに入る

$ docker exec -it myapp-db-1 bash

リストア実行

コンテナ内で:

# mysql -u root -p -D app < /tmp/app.dump.sql

-D app は対象DBが事前に作成済みであることが前提。ダンプ内に CREATE DATABASE や USE 文が入ってない場合はDBが存在しないとここでコケる。逆にダンプ側に USE が入ってる場合は -D は実質無視されるので、そこは重複しても害はない。

コンテナに入らなくても済ませられる

docker exec -it でシェルに入らなくても、ホスト側のファイルをそのまま流し込む形なら1行で終わる。

$ docker exec -i myapp-db-1 mysql -u root -p app < app.dump.sql

この場合 docker cp の手順自体が不要になる。コンテナ内に一旦ファイルを置きたくない時はこっちの方が早い。