Alpineコンテナでpip経由でxlsx2csvをインストールしたら「error: externally-managed-environment」出たときの対処法


※ 当ページには【広告/PR】を含む場合があります。
2024/08/24
Linuxでシェルコマンドからエクセルファイル(XSLX)を新規作成する方法〜「libreoffice」と「ssconvert」




普段から業務でもLinuxばかり扱っているのですが、たまにExcelファイルを扱いたい場合、
『xlsx2csv』 コマンドがとても便利に使えます。

合同会社タコスキングダム|蛸壺の技術ブログ
【xlsx2csvコマンド活用編】Linux環境でExcelファイル(xls/xlsx)をCSVデータに変換する

LinuxコマンドからExcelのCsv形式のデータをエクスポートしたい場合に利用できるxlsx2csvコマンドの使い方を簡単に解説します。



最近、会社の資料作りで、久しぶりに「xlsx2csv」コマンドを
alpine(node)コンテナ でインストールして使ってみたときのこと、

            $ 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」で
python仮想環境 を要求されているようです。
そもそもコンテナで仮想化してるのに、さらにvirtualenvで内部を仮想化...というのもなんだか頭のゴチャゴチャする話です。
もう一点、警告文の下のほうに、
「仮想環境の自動構築にはpipxも検討して」 と一言添えられています。
幸いにも、Alpineでは
「pipx」 のパッケージが使えますので、ここは一つpipxを使ったxlsx2csvコマンドのインストール法へ修正してみます。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法】Dockerをこれから学びたい人のためのオススメ書籍&教材特集

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の
「USER」 の記述位置には気をつける必要があります。
例えば、先程のDockerfileで
「USER node」 がなかった場合、xlsx2csvはrootのみが利用できる場所( /root/.local/bin )へインストールされてしまうので、root以外のユーザーからは利用することができません。
root以外のユーザー権限でpipインストールする場合にはこの辺を良く確認しましょう。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法】Dockerをこれから学びたい人のためのオススメ書籍&教材特集

まとめ



今回は、alpineコンテナをベースにしてxlsx2csvをインストールするときのポイントを紹介しました。
そもそもAlpineにこだわりがなければ、node:bookworm-slimなどのDebian系をベースにすると、xlsx2csvがインストールできるわけですが...少しでもコンテナサイズを軽量化したいAlpine利用者向けの小技としては価値があると思われます。
記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。

合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法】Dockerをこれから学びたい人のためのオススメ書籍&教材特集