dockerコンテナ内で生成したファイルを、ホスト(PC)へDL(連携)する方法

dockerコンテナ内でpythonのライブラリをinstallし、そのライブラリをzip化。 そして、そのzipファイルをホスト環境(ローカルPC)へ連携することを実現します。

①:phpのライブラリをinstallするdockerコンテナ環境を構築

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
Dockerfile
FROM python:3.7

RUN apt-get update && apt-get install -y zip unzip

#pipでinstallしたいディレクトリ$$パッケージを指定&&インストール
RUN pip install --target ./python google-api-python-client google-auth requests-oauthlib

ADD entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

・imageのベースはphp 3.7をpullしてきています。
・pip install で installしたいライブラリを。※今回zipファイルで連携したいライブラリ郡です。
・entrypoint.shをコンテナ上に追加・コンテナでの操作権限を付与して、コンテナで上で、コンテナ上でコマンド実行可能な状態を作る。(コマンドの具体は、entrypoint.shに記載)
・ENTRYPOINTに /entrypoint.shを指定して、コンテナ起動後の実行を指定

②:ライブラリをZip化 / entrypoint.shにてコードで実行

entrypoint.sh
!/bin/bash -eu
 SRC=/python
 DIST=/dist/layer.zip
 zip -q -r ${DIST} ${SRC}
 /bin/bash

・コンテナ上の/python ディレクトリをzip化して、 DISTで指定したディレクトリ位置へ
・コンテナ内を確認するために、 /bin/bash を起動させる。

・DIST=/dist/layer.zip というdistディレクトリが突然現れました。これは、後に、run する際にバインドマウントする際に連携するディレクトリです。※詳細は下記

③:バインドマウントをして、dockerコンテナとホストを連携

docker build でimageを作成

docker build . -t {imageのnameを指定}

docker run で コンテナ起動 &&

docker run --rm -v $(pwd):/dist -it {imageのname}

rm:終了後、コンテナ削除

今回の処理の一番重要な部分は、

-v $(pwd):/dist 

ここです。

ここのバインドマウントの処理によって、
$(pwd):ホストの現在のディレクトリ

/dist :コンテナ上の distディレクトリ
を連携しています。
※FROM python:3.7にはdistは存在しないので、このタイミングで自動生成される。

この後、
>>②:ライブラリをZip化 / entrypoint.shにてコードで実行

>> zip -q -r ${DIST} ${SRC} の処理によって
dist へLayer.zipが生成されています。

④:ホスト環境 / dockerコンテナ環境で確認

④-1:ホスト環境を確認

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip

上記のようになってると思います。

④-2:dockerコンテナ環境を確認

/bin/bashでコンテナを起動していると思いますので、コンテナの中身を確認していきましょう。

distディレクトリに移動して、その中で空のディレクトリを生成してみて下さい。

cd dist && mkdir gogo

そうすると、コンテナ上の/dist/gogoディレクトリが生成されます。

それと同時に、ホスト環境でも下記のようになっていると思います。

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip
 L gogo

⑤:バインドマウント

https://matsuand.github.io/docs.docker.jp.onthefly/storage/

バインドマウントを利用する際の副作用として、これが良いことか悪いことかはわかりませんが、コンテナー 内に動作するプロセスを通じて ホスト のファイルシステムに変更がかけられるということです。 たとえばシステムにとって重要なファイル、ディレクトリを生成、編集、削除ができてしまいます。 セキュリティに影響を及ぼしかねない強力な能力がここにあって、ホストシステム上の Docker 以外のプロセスへも影響します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です