質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

398閲覧

Data Volumeコンテナで利用しているデータをエクスポート・リストアしたい

shotamatsumoto

総合スコア10

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2018/10/20 13:08

編集2018/10/20 14:45

前提・実現したいこと

「Docker/Kubernetes 実践コンテナ開発入門」に則ってDockerを学習中です。
Data Volumeコンテナで利用しているデータをホスト側にエクスポートした後、他のDockerホストにリストアしたい。

発生している問題・エラーメッセージ

以下に記したコマンドを入力したところ、出力先として指定したbusyboxコンテナの/tmpディレクトリには問題なくmysql-backup.tar.gzが出力されたが、/tmpディレクトリをカレントディレクトリにマウントできていない。

該当のソースコード

Docker Volumeで利用しているデータをホスト側にエクスポートする際のコマンド

$ docker container run -v `${PWD}`:/tmp \ --volumes-from mysql-data \ busybox \ tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql

Data Volumeコンテナ用Dockerfileを作成

Dockerfile

1FROM busybox 2 3VOLUME /var/lib/mysql 4 5CMD ["bin/true"]
$ docker image build -t example/mysql-data:latest .

mysql-dataという名前をつけてData Volumeコンテナを実行

$ docker container run -d --name mysql-data example/mysql-data:latest
$ docker container run -d --rm --name mysql \ -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" \ -e "MYSQL_DATABASE=volume_test" \ -e "MYSQL_USER=example" \ -e "MYSQL_PASSWORD=example" \ --volumes-from mysql-data \ mysql:5.7

実行中のmysqlコンテナにデータを挿入する

$ docker container exec -it mysql mysql -u root -p volume_test Enter password: mysql> CREATE TABLE user(id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; INSERT INTO user (name) VALUES ('Reegan'), ('Cayden'), ('Faizaan');

データが挿入されていることを確認

$ docker container exec -it mysql mysql -u root -p volume_test Enter password: mysql> SELECT * FROM user; +----+---------------+ | id | name | +----+---------------+ | 1 | Reegan | | 2 | Cayden | | 3 | Faizaan | +----+---------------+ 3 rows in set (0.00 sec)

新たにbusyboxコンテナを実行し、Data Volumeコンテナにmysql-dataを指定、tarコマンドでアーカイブを行い、出力先の/tmpディレクトリをカレントディレクトリにマウントするコマンドを入力

$ docker container run -v `${PWD}`:/tmp \ --volumes-from mysql-data \ busybox \ tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql

ターミナル上の出力

bash: /Users/<user_name>/ch03_4_2: is a directory tar: removing leading '/' from member names var/lib/mysql/ var/lib/mysql/volume_test/ (中略) var/lib/mysql/private_key.pem

エクスポート後カレントディレクトリでlsコマンドを打つと、

$ ls Dockerfile

mysql-backup.tar.gzがエクスポートされていない。

試したこと

mysql-backup.tar.gzがbusyboxコンテナ内の出力先として指定した/tmpディレクトリに出力されていることを確認。

$ docker container exec -it hungry_easley ls /tmp mysql-backup.tar.gz

補足情報(FW/ツールのバージョンなど)

macOS High Sierra-10.13.6
Docker CE-2.0.0.0-beta1-mac75 (27117)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2018/10/20 13:10

本文から不要な部分は削り、質問の前に調べたことを書いてください。それとも丸投げですか?
shotamatsumoto

2018/10/20 13:13

本文の文字数超過のエラーを確認する前に投稿してしまいました。現在は本文を一部削りましたので、正しく表示されているかと思います。もしOrlofskyさんが本質問内容に明るいのでしたら、お力添えいただければ幸いです。よろしくお願い致します。
guest

回答2

0

自己解決

自己解決できたため、その方法を記します。

$ docker container run -v `${PWD}`:/tmp \ --volumes-from mysql-data \ busybox \ tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql

このようなコマンドでアーカイブ化、マウントを試みていましたが、次のようにコマンドを修正して再度試したところ、無事カレントディレクトリに/tmpディレクトリをマウントすることができました。

$ docker container run -v ${PWD}:/tmp \ --volumes-from mysql-data \ busybox \ tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql
$ ls Dockerfile mysql-backup.tar.gz

投稿2018/10/20 15:39

shotamatsumoto

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2018/10/20 15:43

busyboxに入っているファイルをホストに出したいのではなく、ホストにマウントした後にmysqlのバックアップ走らせるってことですね。質問の要件を取り違えてました
guest

0

mysql-backup.tar.gzがbusyboxコンテナ内の出力先として指定した/tmpディレクトリに出力されているということですので、mysql-backup.tar.gz はbusyboxコンテナ内の /tmpにあります。
この状態で docker container run -v ${PWD}:/tmp を行うとホスト側のカレントディレクトリが busyboxコンテナの/tmpにマウントされるのでbusyboxの/tmpに入っているファイルは見えなくなるのはその通りです。

では、どのようにしてコンテナのファイルをホスト側に持ってくるかというと
ホスト側のカレントディレクトリを /tmpではなく他のディレクトリ(例えば /tmp2 とか /tmp/hostとか)にマウントします。
この状態で cp /tmp/mysql-backup.tar.gz /tmp2 としてあげればよいのではないでしょうか?

投稿2018/10/20 15:16

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shotamatsumoto

2018/10/20 15:35

回答ありがとうございます。 試行錯誤していたところ、以下のコマンド内の`${PWD}`を${PWD}に修正してサイド走らせたところ、カレントディレクトリにbusyboxコンテナ内の/tmpディレクトリをマウントすることができました。 $ docker container run -v `${PWD}`:/tmp \ --volumes-from mysql-data \ busybox \ tar cvzf /tmp/mysql-backup.tar.gz /var/lib/mysql
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問