Q. Dockerに入れたみたいだけど、何するんだっけ? A. pip install
今度は、
cd var/app/tmp
を実行し、ここで
mkdir python
としてみます。
mkdir: cannot create directory 'python': Not a directory
エラーメッセージですね。検索しましょう。「cannot create directory」の結果がたくさん出てきますが、関係あるのは[ubuntu] mkdir cannot create directory : not a directoryやSnap cannot create user data directory: Not a directory - Unix & Linux Stack Exchangeでしょうか? 私の力では解決に繋がりませんでした……。神託が下りてきます。一度またDockerから出て、先ほどの、
docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/tmp:/var/app/tmp:z docker_575_awslinux2_image
の代わりに
docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/layer:/var/app/tmp:z docker_575_awslinux2_image
と、ホスト側のディレクトリ名を/tmpから/layerに変えるとmkdir pythonできます。なぜなのかはわかりませんが、とりあえずこれでも問題ないので進めます。
同期しているのはvar/app/tmpなので、
cd var/app/tmp
と移動し、改めて
mkdir python
としてディレクトリを作ります。ようやくできるようになっただろうと
pip install -t python requests
とすると…失敗します。
bash: pip: command not found
このコンテナにはまだpipが入っていませんでした。pip自体をインストールするために、「pip install」で検索し、pipの使い方とインストール | Python-izmを見つけます。
Q. pip自体のinstallってどうするんだっけ A. 公式通り、ダウンロードしてpythonで実行するとできる
https://bootstrap.pypa.io/get-pip.pyをダウンロードし、コンテナ内から実行します。
が、失敗します。
python get-pip.py ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.
Q. ダウンロードしたget-pipがpythonで実行ができないけど… A. Pythonをアップデートしよう
うーん入っているPythonが2.7で、古すぎるらしい。2.7のget-pipをしても良いけど、3.9の環境で動かすのでPythonのバージョンを上げるのが先か? でもPython 3.9はこのFROM amazonlinux:2
で動かすんじゃなかったのか?
疑問に思ったので「amazonlinux:2 python 3.9」で検索し、AmazonLinux2にPython3.9をインストールするやAmazon Linux 2 & Python3.9のDockerイメージ【DL可】を見つけます。そういえばAmazon Linux 2はPython3.9以外のものも動かすので、確かにPython3.9が最初から入っているわけはありませんでした。
Dockerfileを改良するだけで終わりそうなのと、せっかくなのでDockerfileを使ってみたかったのでAmazon Linux 2 & Python3.9のDockerイメージ【DL可】にしたがってみます。
FROM amazonlinux:latest RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget zip tar gzip make && \ cd /opt && \ wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz && \ tar xzf Python-3.9.6.tgz && \ /opt/Python-3.9.6/configure --enable-optimizations && \ make altinstall && \ rm -f /opt/Python-3.9.6.tgz && \ python3.9 -m pip install --upgrade pip
と書いてあり、多分latestは2だろうと思いながら眺めます。
3行目が少し不穏です。
まずは「yum」で検索すると、【 yum 】コマンド(基礎編)が見つかり、インストールに使うコマンドらしいです。openssl-devel
で検索してhttps://centos.pkgs.org/7/centos-x86_64/openssl-devel-1.0.2k-19.el7.x86_64.rpm.htmlを見つけ、Files for development of applications which will use OpenSSLとのこと。
他も調べるとPython3のインストールが出てきます。ちなみに「openssl-devel bzip2-devel libffi-devel」と検索してみると、なんとすごく近いことをしている元薬学生のpython/仮想通貨ブログを偶然見つけます。さっきのAmazon Linux 2 & Python3.9のDockerイメージ【DL可】も引用していますね。
webからファイルをダウンロードしたり、ダウンロードしたファイルを解凍したりするために必要なものをinstallし、ファイルをダウンロードしてインストールして…ということをやってくれているようですので、Dockerfileに改めて
FROM amazonlinux:latest RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget zip tar gzip make && \ cd /opt && \ wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz && \ tar xzf Python-3.9.6.tgz && \ /opt/Python-3.9.6/configure --enable-optimizations && \ make altinstall && \ rm -f /opt/Python-3.9.6.tgz && \ python3.9 -m pip install --upgrade pip
と書いて、imageを作るところ(dockerfileを書いた直後)からやり直します。
docker build -t docker_575_awslinux2_image . docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/layer:/var/app/tmp:z docker_575_awslinux2_image cd var/app/tmp/ mkdir python
とします。ちなみにさっきとは違い、3分ほどかかります。
pip install -t python requests
動きました。
でも、
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
が出ていますね。エラーではないですが検索すると、Python3系のアップロード pip installをするとRunning pip as root will break packages and permissions.が見つかり、仮想環境を使ったらどうかと言われています。今回は仮想と言えば仮想なんですが、venv的な仮想環境ではないので問題ないとして次へ進みます。また、ここでホスト側(ファインダーから確認できる手元のパソコン)のlayerディレクトリのpythonディレクトリにも、インストールされたものが確認できます。
続けて
pip install -t python jaconv pip install -t python mecab-python3 pip install -t python ipadic pip install -t python regex
を実行します。ホスト側のファインダーでlayer/pythonにkanehosi_tukeai.pyをコピーすることでコンテナ内のvar/app/tmp/pythonにkanehosi_tukeai.pyを入れ、slackのチャンネルに「古池や蛙飛びこむ水の音」と投稿して数秒後に
cd python python3.9 kanehosi_tukeai.py
とすると…Slack「スッコココ!」とコンテナ内からもSlackへの投稿が実行できました。
今度こそLambdaで動くプログラムとレイヤーが用意できてそうです。次の記事では、これをLambda上で実行します。