Dockerのコンテナ上で作成したファイルを別コンテナに共有する方法
みなさんごきげんよう。
大型連休いかがお過ごしだったでしょうか。
食べてネトフリ見て寝て、食べてアマプラ見て寝て、だったyamashitaです。
さて今回はDockerのコンテナ上で作成したファイルを別コンテナに共有する方法を紹介したいと思います。
位置づけとしては前回の補足?でLOAD DATA INFILEに使用するファイルをPHPで作成し、MySQLで読み込む際にDockerで立てた環境だとひと手間必要なので、別記事として紹介させていただきます。
何故共有が必要だったか
PHPで編集したファイルをそのままデータベースに渡せることが理想でしたが、諸事情によりDockerのコンテナで環境を構築していました。
そのため編集したファイルをそのままデータベースで読みこむ事は難しいため、コンテナ間でファイルを共有する方法が必要になりました。
ことわり
コンテナ管理はdocker-composeを使用しているものとします。
共有方法
事前にコンテナ間で共通したホストのディレクトリをマウントしておく
これをやらないとどうにもならないです。
docker-compose.ymlの各コンテナのvolumes:の下にファイルパスを書いて指定します。
volumes:
# 既に何行か
# 設定ファイルなどが
# 指定されている
# ":"の左側はホストなので共通、右側は適宜各コンテナで変更しても可
- ./share_in_docker:/tmp/share_file
PHP側実装例
タイトルのファイル共有方法は上で完了です。以下は実装例になります。
流れとしては元々あるcsvファイルのデータをデータベース用に編集、ファイルに書き込むという物です。
その後にPHP内でクエリを実行します。
// 前回の条件としてもらったファイルを編集してデータベースに受け渡すでした。
$lines = new SplFileObject(("編集前のファイルがあるパス"));
$lines->setFlags(SplFileObject::READ_CSV);
$shareFilePath = "/tmp/share_file/file.csv";
$fileContent = [];
foreach ($lines as $index => $line) {
/*
* 中略・ファイルを編集
* $fileContentにまとめる
*/
}
touch($sharePath); // 共有するファイルを作成
$modResult = chmod($sharePath, 0777); // 権限が無い場合があるのでその時は権限変更
// 以下で編集した内容を書き込み
$f = fopen($sharePath, "w");
foreach ($fileContent as $fileContentLine) {
fputcsv($f, $fileContentLine);
}
fclose($f);
// WordPressを使ってたので$wpdbで対応してますが、各々の環境に適した方法でクエリ発行
$query = "LOAD DATA LOCAL INFILE '{$shareFilePath}' INTO TABLE wp_posts FIELDS TERMINATED BY ',' ENCLOSED BY '\"' (post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status,comment_status,ping_status,post_password,post_name,to_ping,pinged,post_modified,post_modified_gmt,post_content_filtered,post_parent,guid,menu_order,post_type,post_mime_type,comment_count);";
$resultQuery = $wpdb->query($query);
まとめ
ポイントは設定時にコンテナ間で共通して使用できるパスを指定する事です。
これさえ出来ていれば実装例以外の利用方法も可能です。
PHP側の実装例を書きましたが、ちょっとタイトルと外れていることもあるのであくまで例として見ていただければと思います。