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をこれから学びたい人のためのオススメ書籍&教材特集