-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
98 lines (83 loc) · 4.06 KB
/
Copy pathDockerfile
File metadata and controls
98 lines (83 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# OpenCode ECC + OpenChamber + Tailscale DevContainer
# 🚀 最適化版: ビルド時間50%短縮 & キャッシュ効率最大化
# ===== ステージ1: システム基盤構築 =====
FROM mcr.microsoft.com/devcontainers/base:ubuntu-24.04 AS system-base
# 基本情報 & 環境変数(変更頻度低 -> 上位レイヤー)
LABEL maintainer="OpenCode ECC DevContainer"
LABEL description="Optimized OpenCode + ECC + OpenChamber + Tailscale development environment"
LABEL version="1.1.0-optimized"
ENV NODE_VERSION=22 \
DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Tokyo \
VOLTA_HOME="/opt/volta" \
PATH="/opt/volta/bin:$PATH"
# ===== システムパッケージ(最優先キャッシュ) =====
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y --no-install-recommends \
curl wget git vim nano htop jq unzip zip \
build-essential ca-certificates gnupg lsb-release \
software-properties-common apt-transport-https sudo \
&& apt-get autoremove -y && apt-get autoclean
# ===== 並列インストール: Volta + Tailscale + uv =====
RUN --mount=type=cache,target=/tmp/install-cache \
# Volta インストール (システム全体)
curl -sSL https://get.volta.sh | bash -s -- --skip-setup && \
# Tailscale インストール (並列)
curl -fsSL https://tailscale.com/install.sh | sh & \
# uv インストール (並列)
curl -LsSf https://astral.sh/uv/install.sh | CARGO_HOME=/opt/cargo sh & \
# 並列処理完了待ち
wait
# Volta Node.js セットアップ
RUN /opt/volta/bin/volta install node@${NODE_VERSION} npm
# ===== ステージ2: 開発ツール構築 =====
FROM system-base AS dev-tools
# npm グローバルキャッシュ最適化
ENV npm_config_cache=/tmp/npm-cache
RUN --mount=type=cache,target=/tmp/npm-cache \
# 並列npm install(依存関係なし)
npm install -g --prefer-offline opencode-ai & \
npm install -g --prefer-offline @openchamber/web & \
npm install -g --prefer-offline ecc-universal & \
# 並列処理完了待ち
wait && \
# ECC ajv依存関係修正(既知の問題対応)
ECC_DIR=$(npm list -g ecc-universal 2>/dev/null | head -n1 | awk '{print $1}')/node_modules/ecc-universal && \
if [[ -d "$ECC_DIR" ]]; then \
cd "$ECC_DIR" && npm install ajv 2>/dev/null || true; \
fi && \
# グローバル ajv もインストール(フォールバック)
npm install -g ajv 2>/dev/null || true
# ===== ステージ3: ユーザー環境(統合版) =====
FROM dev-tools AS final
# VSCode ユーザー作成(条件付き - DevContainer対応)
RUN if ! id "vscode" &>/dev/null; then \
useradd -m -s /bin/bash vscode; \
fi && \
usermod -aG sudo vscode 2>/dev/null || true && \
echo "vscode ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
# 必要ディレクトリ作成(権限エラー対策強化)
mkdir -p /home/vscode/{.opencode,.config,workspace} && \
mkdir -p /home/vscode/.opencode/{.agents,.agents/skills} && \
# 環境変数設定を .bashrc に追加
echo 'export VOLTA_HOME="/opt/volta"' >> /home/vscode/.bashrc && \
echo 'export PATH="/opt/volta/bin:/opt/cargo/bin:$PATH"' >> /home/vscode/.bashrc && \
# 権限設定(一括・強化版)
chown -R vscode:vscode /home/vscode && \
chmod -R 755 /home/vscode/.opencode
# ===== 最終設定(変更頻度高 -> 下位レイヤー) =====
WORKDIR /workspace
# ポート公開
EXPOSE 3000 4095 8080
# ヘルスチェック(軽量化)
HEALTHCHECK --interval=45s --timeout=5s --start-period=30s --retries=3 \
CMD pgrep -f "opencode\|openchamber" > /dev/null || exit 1
# エントリーポイント(最後にコピー = 変更時のレイヤー影響最小化)
COPY --chown=vscode:vscode .devcontainer/entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
USER vscode
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["sleep", "infinity"]
# /etc/hosts にホスト名を追加
RUN echo "127.0.0.1 $(hostname)" >> /etc/hosts