本日Dockerのコンテナーからとりあえずファイルを転送したいって要件にぶち当たったので、とりあえずcurlを利用して送った方法をメモしておきます。
これも、最近多い「自分に対する備忘録」です。申し訳ありません。
Dockerホストからコマンドを叩く訳ではない。コンテナーからやりたい
経緯としては
- Dockerコンテナーが自動生成される環境
- Dockerコンテナーがいつ自動生成されるか、ホストは知らない
- だから、Dockerコンテナーの「中から」、Dockerコンテナーのファイルを転送したい
(厳密には、自分自身が死ぬ前に、ファイルを転送したい。シェルとかで)
なので、docker cpは使えない(ですよね?)。
なので、以下の選択肢を考えた。
- 外の世界にNFSサーバーを立てる
- 外の世界にhttpサーバーを立てて、phpでcurl転送する
前者が15分くらいやってもうまくいかなかった。
面倒だから、後者にした。
外の世界にhttpサーバーを立てる(with php)
もう、自宅ラボだからセキュリティはどうでもいい。全くセンシティブな情報はない。
だから、とりあえず動かすためである。
- yum install -y httpd
- yum install -y php
とりあえず、これでApacheでphpが使えるはず。
ファイルアップロード用のphpスクリプト作成
あとは、色んな人のサイトを参考に、phpのアップロード簡易スクリプトを作成。
(この方のサンプルを、ほぼ丸コピーさせていただきました・・・)
[root@mng-server html]# pwd /var/www/html [root@mng-server html]# cat upload.html <html> <body> <form enctype="multipart/form-data" action="upload.php" method="POST"> UPLOAD FILE : <input name="userfile" type="file" /> <input type="submit" value="UPLOAD!" /> </form> </body> </html> [root@mng-server html]# cat upload.php <?php $uploaddir = '/var/www/html/file/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "<b>Upload success.</b>"; } else { echo "$uploadfile"; echo "<b>Upload failed.</b>"; } // DEBUG print_r($_FILES); ?> [root@mng-server html]#
変えたのは、「/var/www/html/file」の箇所くらい。
そして、/var/www/html/fileディレクトリを作成する。パーミッションを設定。
稼働確認
ブラウザから普通にファイルをアップロードしてみる。URLに「Apache立てたホスト名/upload.html」と指定して。
これでOKだろう!・・・と思いきや、httpdのerror_logに以下が表示されて、アップロードできない。
[Mon Nov 07 07:45:21.081648 2016] [:error] [pid 8420] [client 192.168.1.230:55037] PHP Warning: move_uploaded_file(/var/www/html/file/test.html): failed to open stream: Permission denied in /var/www/html/upload.php on line 4, referer: http://mng-server.mylabo.local/upload.html [Mon Nov 07 07:45:21.081668 2016] [:error] [pid 8420] [client 192.168.1.230:55037] PHP Warning: move_uploaded_file(): Unable to move '/tmp/phpepBmq2' to '/var/www/html/file/test.html' in /var/www/html/upload.php on line 4, referer: http://mng-server.mylabo.local/upload.html
この時点で泣きそうになる。でも、Google先生は偉大です。
SELinuxが邪魔していました。
setenforce 0
無事ブラウザからファイルのアップロードがされた事を確認。(つまり、/var/www/html/fileにファイルが追加された)
Dockerコンテナーからcurlでアップロードする!
当然だが、まずはコンテナにログインして確認する。(実際はDockerコンテナにシェルを埋め込んでおくが・・・)
[root@testmachine ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XXXXXXX tmp/container:latest "test.sh" 6 seconds ago Up 5 seconds docker_tmp [root@testmachine ~]# docker exec -it docker_tmp /bin/bash
あとは、以下みたいな感じで、Dockerからcurlでファイルをアップロードする。
curl -F userfile=@/tmp/insidedocker.log http://Apacheを起動しているサーバー/upload.php
無事Apacheにファイルを転送できた。
所要時間1時間程かかりました・・・
コメント