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 以外のプロセスへも影響します。