0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TL;DR

原因:Debian TrixieでOpenGL関連ライブラリのパッケージ名が変わっていた。libgl1-mesa-glxは死亡。

解決策:以下をインストール。

sudo apt-get update && sudo apt-get install -y --no-install-recommends \
    libgl1 \
    libglib2.0-0t64 \
    libsm6 \
    libxext6 \
    libxrender1 \
    libgomp1

教訓:Dockerfileに環境依存を焼き込むな。コンテナ内で都度対応が現実。


背景

WSL2 + Docker + Dev Containers で Python3.13の開発環境を構築。Jupyter上で grad-cam を使ってGradCAMの可視化をしようとした。

from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, HiResCAM, LayerCAM

あ、落ちた。

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

なんもしてないのに壊れた。厳しいって。


環境情報

  • OS: Debian Trixie (on WSL2)
  • Python: 3.13
  • Docker Image: python:3.13-slim
  • Dev Containers: VSCode最新
  • 依存ライブラリ: grad-cam, opencv-python, torch, torchvision

問題発生

Dockerfileに以下を追加して再構築したのに、同じエラーが繰り返す。

RUN apt-get update && apt-get install -y --no-install-recommends \
    libgl1-mesa-glx \
    libglib2.0-0 \
    libsm6 \
    libxext6 \
    libxrender-dev \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*

コンテナ再構築しても反応なし。docker system prune -a --volumes しても無視。

Package 'libgl1-mesa-glx' has no installation candidate

パッケージが消えてた。つまり、古いDocker手順でコンテナ作ったら、Debian Trixieではそのパッケージはもうない。気づくの遅い。python3.16はもう始まってるって。


原因

Debian Trixieでパッケージ名が刷新された。

旧パッケージ名 新パッケージ名
libgl1-mesa-glx libgl1
libglib2.0-0 libglib2.0-0t64
libxrender-dev libxrender1

古い手順をコピペしてたら、アーキテクチャ対応の変更を見逃す。よくある話。

python:3.13-slim は Debian Trixie をベースにしてる。つまり、2024年後半にセットアップした人は全員これに引っかかる。

ガチで危機感持った方がいいって。


解決策

ステップ1:コンテナ内で直接インストール

すでにコンテナが起動してるなら、一度実行してしまえ。

sudo apt-get update && sudo apt-get install -y --no-install-recommends \
    libgl1 \
    libglib2.0-0t64 \
    libsm6 \
    libxext6 \
    libxrender1 \
    libgomp1

即座に動く。Dockerfileの再構築より早い。

ステップ2:Dockerfileに正しい依存を焼き込む(推奨)

FROM python:3.13-slim

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    UV_CACHE_DIR=/tmp/.uv-cache \
    UV_PYTHON=python3.13

# Debian Trixie対応のシステムライブラリ
RUN apt-get update && apt-get install -y --no-install-recommends \
    git \
    curl \
    build-essential \
    libgl1 \
    libglib2.0-0t64 \
    libsm6 \
    libxext6 \
    libxrender1 \
    libgomp1 && \
    rm -rf /var/lib/apt/lists/*

COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

WORKDIR /workspace

RUN useradd -m -s /bin/bash vscode && \
    chown -R vscode:vscode /workspace

USER vscode

ENV PATH="/workspace/Image_marimo/.venv/bin:/workspace/Table_marimo/.venv/bin:/home/vscode/.local/bin:${PATH}"

CMD ["/bin/bash"]

ポイント:

  • libgl1-mesa-glxlibgl1
  • libglib2.0-0libglib2.0-0t64
  • libxrender-devlibxrender1

その後、Dev Containerを再構築。

VSCode: "Dev Containers: Rebuild Container"

ステップ3:Notebookで動作確認

from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, HiResCAM, LayerCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
#動いた

教訓

  1. 古いDocker手順を信じるな

    • パッケージ名は年単位で変わる。
    • 公式ドキュメント > ネット記事。
  2. コンテナ内で都度対応するのも戦略

    • Dockerfileの完全性を求めるより、起動後の微調整が速いときがある。
    • 本番環境なら焼き込め。開発中なら走りながら治す。
  3. Debian/Ubuntu のライブラリ名は t64 チェック

    • 最近のDebianは64ビット対応で t64 が追加される傾向。
    • libglib2.0-0libglib2.0-0t64 のように。

結論、お前らが古い手順で環境構築していた時間、俺はDebian Trixieのドキュメント読んでた。周りは待ってくれないって。

技術は前に進む。Docker Hub の base image も更新され、パッケージ名も変わる。動作環境を固定しない限り、追従が必須。

動く環境が正義。甘えんなって。


参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?