Dockerfile を丁寧に作る

2025.2.1 の最終形態

# 1. 公式の PyTorch イメージをベースにする
FROM docker.io/rocm/pytorch:rocm7.2_ubuntu24.04_py3.12_pytorch_release_2.9.1
 
# 2. 作業ディレクトリの設定
WORKDIR /app
 
# 3. uv のインストール(環境構築を高速化するため)
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
ENV PATH="/root/.local/bin:$PATH"
 
#
RUN apt-get update && apt-get install -y \
    curl \
    vim \
    git \
    && rm -rf /var/lib/apt/lists/*
 
RUN cat <<'EOF' >> /etc/skel/.bashrc
 
# --- Added for Strix Halo Environment ---
# 実行時にパスを特定(隔離されていてもパス文字列として /home/username を取得)
REAL_HOME=$(echo "${HOME}" | cut -d "/" -f 1-3)
 
# このパスがホスト側の実体と繋がっているなら、これだけで全て解決
export HF_HOME="${REAL_HOME}/models/huggingface"
 
# 2. 三種の神器(Models, Input, Output)をホストへ直結
for dir in models input output; do
    TARGET_DIR="/app/ComfyUI/$dir"
    if [ -d "$TARGET_DIR" ] && [ ! -L "$TARGET_DIR" ]; then
        rm -rf "$TARGET_DIR"
        ln -s "${REAL_HOME}/ComfyUI/$dir" "$TARGET_DIR"
        echo "🔗 Linked $dir to ${REAL_HOME}/ComfyUI/$dir"
    fi
done
 
export VIRTUAL_ENV_DISABLE_PROMPT=1
ROCm_V=$(cat /opt/rocm-*/.info/version 2>/dev/null | head -n 1 | cut -d. -f1,2 || echo "no-rocm")
C_NAME=$(grep "name=" /run/.containerenv 2>/dev/null | cut -d"\"" -f2 || hostname)
PS1='$( [ -n "$VIRTUAL_ENV" ] && echo "\[\e[1;32m\][$(basename $VIRTUAL_ENV)] \[\e[m\]" )\[\e[1;36m\]📦 \[\e[1;34m\]$C_NAME\[\e[m\]:\[\e[1;35m\]$ROCm_V\[\e[m\] \[\e[1;33m\]\w\[\e[m\] \$ '
 
# venvを自動ロードするようにしておく(お好みで)
if [ -d "/opt/venv" ]; then
    source /opt/venv/bin/activate
fi
EOF
 
# 6. vLLM のインストール
ENV VIRTUAL_ENV=/opt/venv
 
RUN git clone https://github.com/comfyanonymous/ComfyUI.git
WORKDIR /app/ComfyUI
RUN uv pip install -r requirements.txt
RUN uv pip install -r manager_requirements.txt
 
# この Downloader がいけてる
RUN git clone https://github.com/romandev-codex/ComfyUI-Downloader ./custom_nodes/ComfyUI-Downloader && \
    cd custom_nodes/ComfyUI-Downloader && \
    uv pip install -r requirements.txt
 
# Download 速度アップ FLAG だけど、トラブルにつながる報告もすくなくない
# 大きな model を Download するときは Container内で 1 にするなどの対応がよい
ENV HF_HUB_ENABLE_HF_TRANSFER=0
 
# 7. 起動用スクリプトの作成
RUN echo '#!/bin/bash\n\
source /opt/venv/bin/activate\n\
# export HSA_OVERRIDE_GFX_VERSION=11.0.0\n\
export HIP_VISIBLE_DEVICES=0\n\
cd /app/ComfyUI\n\
python3 main.py --highvram --listen --enable-manager --enable-manager-legacy-ui' > /usr/local/bin/run_comfy.sh && \
    chmod +x /usr/local/bin/run_comfy.sh
 
# 作業ディレクトリを戻しておく
WORKDIR /app/ComfyUI
 
# 権限設定 (そこそこ時間がかかる)
RUN chown -R 1000:1000 /opt/venv /app
 
# 自動起動するなら
# CMD ["/bin/bash", "-c", "source /opt/venv/bin/activate && export HSA_OVERRIDE_GFX_VERSION=11.0.0 && python3 main.py --highvram --listen"]

distrbox 起動方法

$ podman build -f Dockerfile.comfyUI -t rocm7.2-comfy .
 
$ distrobox create -n rocm72-comfy -i localhost/rocm7.2-comfy --additional-flags "--device /dev/kfd --device /dev/dri --group-add video --group-add render --security-opt seccomp=unconfined" --home ~/distrobox_homes/rocm72-comfy

[Container_Home]/ComfyUI/models, input, output は
[Host_Home]/ComfyUI/models, input, output にリンクしたい

.bashrc (/etc/skel/.bashrc) に、symlink をかいているが、それは systemd 起動時にはタイミングの問題か機能しない。

一度、distrobox enter しておけば、.bashrc の初期処理が動くので問題ないが、うっかりがあると美しくない状態であることに留意。

/usr/local/bin/run_comfy.sh に symlink を移せば解決するが、どうしようか思案。

常時起動にする

本当の常時起動に

通常、—user サービスは「ユーザーがログインした時」に開始され、「ログアウトした時」に終了します。注意が必要です。

systemd —user は、その名の通り「ユーザーに紐付いた管理システム」です。

ログイン時: あなたのための systemd プロセスが起動し、サービスを開始する。

ログアウト時: あなたが去ったので、後片付けとして systemd ごとサービスをすべて道連れに終了させる。

解決策:loginctl enable-linger
これを解決するのが「Linger(居残り)」設定です。

このコマンドを一度打つだけで、挙動が以下のように変わります:

起動時: ログインを待たずに、システム起動と同時にあなたの —user サービスが動き出す。

ログアウト後: あなたがログアウトしても、サービスは裏で動き続ける。

$ loginctl enable-linger