カテゴリー
Alpineコンテナでpip経由でxlsx2csvをインストールしたら「error: externally-managed-environment」出たときの対処法
※ 当ページには【広告/PR】を含む場合があります。
2024/08/24
普段から業務でもLinuxばかり扱っているのですが、たまにExcelファイルを扱いたい場合、
最近、会社の資料作りで、久しぶりに「xlsx2csv」コマンドを
$ docker compose build
#...中略
=> ERROR [app 5/6] RUN pip install xlsx2csv
------
> [app 5/6] RUN pip install xlsx2csv:
error: externally-managed-environment
× This environment is externally managed
╰─>
The system-wide python installation should be maintained using the system
package manager (apk) only.
If the package in question is not packaged already (and hence installable via
"apk add py3-somepackage"), please consider installing it inside a virtual
environment, e.g.:
python3 -m venv /path/to/venv
. /path/to/venv/bin/activate
pip install mypackage
To exit the virtual environment, run:
deactivate
The virtual environment is not deleted, and can be re-entered by re-sourcing
the activate file.
To automatically manage virtual environments, consider using pipx (from the
pipx package).
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
------
failed to solve: process "/bin/sh -c pip install xlsx2csv" did not complete successfully: exit code: 1
というような感じで、pip経由のインストールがコケるようになりました。
どうやら一般ユーザーの使うローカルなpythonモジュールは、alpineコンテナで使うシステム(root)のpythonではなく、「virtualenv」で
そもそもコンテナで仮想化してるのに、さらにvirtualenvで内部を仮想化...というのもなんだか頭のゴチャゴチャする話です。
もう一点、警告文の下のほうに、
幸いにも、Alpineでは
pipxでxlsx2csvをインストール
まずズバッと結論からいきましょう。
おおよそ以下のように
Dockerfile
FROM node:22.7-alpine3.20
RUN apk update && apk upgrade && apk add --no-cache \
bash python3
#👇旧式のインストール方法
#RUN apk add --no-cache py3-pip
#RUN pip3 install xlsx2csv
#👇pipxを使ったインストール方法に変更
RUN apk add --no-cache pipx
USER node
RUN pipx ensurepath && pipx install xlsx2csv
#...以降略
これでxlsx2csvがインストールすることができます。
なかなか便利ですね、pipx。
コンテナ内にインタラクティブモードで入り、インストールにできているかをチェックすると、
$ whoami
node
$ xlsx2csv -v
0.8.3
$ which xlsx2csv
/home/node/.local/bin/xlsx2csv
というようにDockerコンテナ内に導入されていることが分かります。
「USER」で利用ユーザーのインストール先の正しく変更する
これはxlsx2csvだけでなくDockerコンテナ内で他のpipxインストールするモジュールにも言えますが、コンテナを利用するroot以外のユーザーが使えるように、Dockerfileの
例えば、先程のDockerfileで
「USER node」
/root/.local/bin
root以外のユーザー権限でpipインストールする場合にはこの辺を良く確認しましょう。
まとめ
今回は、alpineコンテナをベースにしてxlsx2csvをインストールするときのポイントを紹介しました。
そもそもAlpineにこだわりがなければ、node:bookworm-slimなどのDebian系をベースにすると、xlsx2csvがインストールできるわけですが...少しでもコンテナサイズを軽量化したいAlpine利用者向けの小技としては価値があると思われます。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー