Repository navigation
Expand file tree
/
Copy pathDockerfile.dev
More file actions
261 lines (228 loc) · 12.1 KB
/
Copy pathDockerfile.dev
File metadata and controls
261 lines (228 loc) · 12.1 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# syntax=docker/dockerfile:1.7
FROM debian:trixie
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG USERNAME=developer
# --- BuildKitのaptキャッシュ設定 ---
#
# aptの自動クリーンを無効化し、/var/cache/aptと/var/lib/aptのキャッシュマウントに
# 入った .debがレイヤーや再ビルドをまたいで残るようにして、aptキャッシュを温存する。
RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
> /etc/apt/apt.conf.d/keep-cache
# --- システムパッケージ ---
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
<<EOF
set -eu
apt update
apt dist-upgrade -yq
PACKAGES=$(cat <<'PKGLIST' | sed 's/#.*//'
bubblewrap # CodexのLinux sandboxに必要
build-essential
ca-certificates # HTTPS接続に必要
curl
file # Shrineによる画像アップロードに必要 (Rails)
fonts-noto-cjk # headless chromiumのスクショ用の日本語 (CJK) フォント
fzf # Claude Codeで使用
git
gnupg # PostgreSQLのGPGキーとaptリポジトリに必要
imagemagick # Shrineによる画像アップロードに必要 (Rails)
jq # Claude Codeで使用
libffi-dev # Ruby拡張のビルドに必要
libglib2.0-0 # libvipsの依存パッケージ (Rails)
libreadline-dev # Rubyのreadline拡張に必要
libssl-dev # SSL関連のビルドに必要
libvips42 # 画像処理ライブラリ (Rails)
libyaml-dev # psych gemのインストールに必要 (Rails)
lsb-release # PostgreSQLのaptリポジトリ設定に必要
nano # Claude Codeで使用
net-tools # Claude Codeで使用するnetstat (ネットワークデバッグ用)
procps # playwright-cli kill-all用のpsを提供
psmisc # Claude Codeで使用するfuser (プロセス特定用)
python3 # Claude Codeのアドホックなスクリプト実行で使用
ripgrep # Claude Codeで使用
sudo
tree # Claude Codeで使用
unzip
vim # Claude Codeで使用
zlib1g-dev # Rubyのzlib拡張に必要 (gem installに必須)
zsh
PKGLIST
)
apt install -y --no-install-recommends $PACKAGES
EOF
# --- PostgreSQLクライアント ---
#
# aptリポジトリの鍵は/etc/apt/keyrings/に置き、[signed-by=...] で参照する。
# trusted.gpg.d/方式は現代のDebianでは非推奨。
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
install -d -m 0755 /etc/apt/keyrings && \
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc \
| gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg && \
chmod 0644 /etc/apt/keyrings/postgresql.gpg && \
echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" \
> /etc/apt/sources.list.d/pgdg.list && \
apt update && \
apt install -y --no-install-recommends libpq-dev postgresql-client-18
# --- mise (開発ツールバージョンマネージャー) ---
#
# Docker向けの推奨設定としてshims方式を使用する (PATHに/mise/shimsを含める)。
ENV MISE_DATA_DIR="/mise"
ENV MISE_CONFIG_DIR="/mise"
ENV MISE_CACHE_DIR="/mise/cache"
ENV MISE_INSTALL_PATH="/usr/local/bin/mise"
ENV PATH="/mise/shims:${PATH}"
RUN curl -fsSL https://mise.run | sh
# Go、Ruby、Node.js、pnpmをmise経由でインストールする。
RUN mise install go@1.26.4 && \
mise install ruby@3.4.4 && \
mise install node@24.13.0 && \
mise install node@20.19.0 && \
mise install node@20.16.0 && \
mise install pnpm@10.25.0 && \
mise install pnpm@10.12.3
# グローバルデフォルトを設定する。
RUN mise use --global go@1.26.4 && \
mise use --global ruby@3.4.4 && \
mise use --global node@24.13.0 && \
mise use --global pnpm@10.25.0
# --- dbmate ---
ARG DBMATE_VERSION=v2.33.0
ARG DBMATE_SHA256=dfd4027141b6e4357158099bdfe6c02b286af70f8e49057937744cf80b38ea1c
RUN curl -fsSL -o /tmp/dbmate "https://github.com/amacneil/dbmate/releases/download/${DBMATE_VERSION}/dbmate-linux-amd64" && \
echo "${DBMATE_SHA256} /tmp/dbmate" | sha256sum -c - && \
mv /tmp/dbmate /usr/local/bin/dbmate && \
chmod +x /usr/local/bin/dbmate
# --- hivemind ---
ARG HIVEMIND_VERSION=v1.1.0
ARG HIVEMIND_SHA256=809ca1c5fedbbfca8fdfb3a4b9bb9c41868b046f35f85a3e893ccf2583a3921a
RUN curl -fsSL -o /tmp/hivemind.gz "https://github.com/DarthSim/hivemind/releases/download/${HIVEMIND_VERSION}/hivemind-${HIVEMIND_VERSION}-linux-amd64.gz" && \
echo "${HIVEMIND_SHA256} /tmp/hivemind.gz" | sha256sum -c - && \
gunzip /tmp/hivemind.gz && \
mv /tmp/hivemind /usr/local/bin/hivemind && \
chmod +x /usr/local/bin/hivemind
# --- golangci-lint ---
ARG GOLANGCI_LINT_VERSION=v2.11.4
ARG GOLANGCI_LINT_SHA256=200c5b7503f67b59a6743ccf32133026c174e272b930ee79aa2aa6f37aca7ef1
RUN GOLANGCI_LINT_DIR="golangci-lint-${GOLANGCI_LINT_VERSION#v}-linux-amd64" && \
curl -fsSL -o /tmp/golangci-lint.tar.gz "https://github.com/golangci/golangci-lint/releases/download/${GOLANGCI_LINT_VERSION}/${GOLANGCI_LINT_DIR}.tar.gz" && \
echo "${GOLANGCI_LINT_SHA256} /tmp/golangci-lint.tar.gz" | sha256sum -c - && \
tar -xzf /tmp/golangci-lint.tar.gz -C /tmp && \
mv "/tmp/${GOLANGCI_LINT_DIR}/golangci-lint" /usr/local/bin/golangci-lint && \
chmod +x /usr/local/bin/golangci-lint && \
rm -rf "/tmp/golangci-lint.tar.gz" "/tmp/${GOLANGCI_LINT_DIR}"
# --- Wikino CLI ---
#
# コンテナではキーチェーンを使えないため、トークンは設定ディレクトリのファイルに保存する。
# 表示言語は既定で英語になるため、日本語を指定する。
ENV WIKINO_TOKEN_STORE=file
ENV WIKINO_LANG=ja
ARG WIKINO_CLI_VERSION=v1.2.0
ARG WIKINO_CLI_SHA256=41cd095cf97bcb03030e49d005272b2d8e743b34cc0f3651a09bad0c8883ce57
RUN WIKINO_CLI_DIR="wikino_${WIKINO_CLI_VERSION}_linux_amd64" && \
curl -fsSL -o /tmp/wikino.tar.gz "https://github.com/wikinoapp/wikino/releases/download/cli/${WIKINO_CLI_VERSION}/${WIKINO_CLI_DIR}.tar.gz" && \
echo "${WIKINO_CLI_SHA256} /tmp/wikino.tar.gz" | sha256sum -c - && \
tar -xzf /tmp/wikino.tar.gz -C /tmp && \
mv "/tmp/${WIKINO_CLI_DIR}/wikino" /usr/local/bin/wikino && \
chmod +x /usr/local/bin/wikino && \
rm -rf "/tmp/wikino.tar.gz" "/tmp/${WIKINO_CLI_DIR}"
# --- GitHub CLI ---
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
install -d -m 0755 /etc/apt/keyrings && \
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
-o /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
chmod 0644 /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
> /etc/apt/sources.list.d/github-cli.list && \
apt update && \
apt install -y --no-install-recommends gh
# --- Playwrightブラウザ (Go E2E) ---
#
# go/e2e/pnpm-lock.yamlの@playwright/testに固定する。同梱のChromium
# ビルドはこれに紐づくため揃えて更新する。install-depsがaptを要するためrootで
# 共有パス (PLAYWRIGHT_BROWSERS_PATH) に入れ、テストを実行するdeveloperユーザーに
# chownする。~/.cache/ms-playwrightはマウントされたボリュームではないため、
# ブラウザをイメージに焼き込むとコンテナ再作成のたびの再ダウンロードを避けられる。
ARG PLAYWRIGHT_VERSION=1.64.1
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \
npx --yes playwright@${PLAYWRIGHT_VERSION} install --with-deps chromium && \
chown -R ${USER_ID}:${GROUP_ID} /ms-playwright
# --- 開発者ユーザーを作成する ---
RUN groupadd -g ${GROUP_ID} ${USERNAME} && \
useradd -u ${USER_ID} -g ${GROUP_ID} -m -s /bin/zsh ${USERNAME} && \
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# --- Goキャッシュディレクトリ ---
RUN mkdir -p /go/.cache/go-build /go/pkg && \
chown -R ${USER_ID}:${GROUP_ID} /go
# --- miseのデータディレクトリの権限設定 ---
RUN chown -R ${USER_ID}:${GROUP_ID} /mise
# --- 1Password CLI・Wikino CLIの設定ディレクトリ ---
#
# 名前付きボリュームop-config・wikino-cli-configをここにマウントする。Dockerが
# イメージ側の所有権を引き継ぐのはボリュームが空で新規作成されたときだけのため、
# `op`・`wikino` が設定を書き込めるよう開発者ユーザー所有のディレクトリを事前に
# 用意しておく。
#
# このディレクトリを用意する前に作られたボリュームはroot所有のままで、
# イメージを再ビルドしても変わらない。削除 (docker volume rm) して空の状態から
# 作り直すことで所有権が反映される。
RUN install -d -o ${USER_ID} -g ${GROUP_ID} /home/${USERNAME}/.config && \
install -d -o ${USER_ID} -g ${GROUP_ID} -m 0700 /home/${USERNAME}/.config/op && \
install -d -o ${USER_ID} -g ${GROUP_ID} -m 0700 /home/${USERNAME}/.config/wikino
WORKDIR /workspace
USER ${USERNAME}
# --- .zshrcの作成 ---
RUN touch ~/.zshrc
# --- miseのシェル設定 ---
#
# Docker環境ではshims方式を使用する (PATHに/mise/shimsを含めている)。
# mise activateはshimsをバイパスしてグローバルデフォルトの直接パスをPATHに
# 追加してしまい、ディレクトリごとのバージョン切り替えが効かなくなるため、
# ここでは実行しない。
RUN mise reshim
# --- 1Password CLI ---
COPY --from=1password/op:2 /usr/local/bin/op /usr/local/bin/op
# --- Claude Code ---
RUN curl -fsSL https://claude.ai/install.sh | bash
# --- Codex ---
RUN curl -fsSL https://chatgpt.com/codex/install.sh | sh
# --- Playwright CLI (エージェント向けブラウザ操作) ---
#
# エージェント向けのplaywright-cliを、このmonorepo内で選択されるmise管理の
# 各Nodeバージョン配下にinstallしてからshimを作る。そのChromiumは上の共有
# /ms-playwrightではなく専用のbrowsersパスに焼き込む。playwright-cliは
# @playwright/test (E2E) より新しいplaywright-coreをpinするため別のChromium
# ビルドを要し、またPlaywrightのinstall時GCはowning playwright-coreリンクが
# 読めないブラウザをpruneする。E2Eのリンクはroot専有の/rootを指すため、
# このユーザーで共有installするとE2E用Chromiumが消える。system依存は
# @playwright/testの --with-depsで導入済みのため、ここでは --with-depsは付けない。
ARG PLAYWRIGHT_CLI_VERSION=0.1.17
ENV WIKINO_PLAYWRIGHT_CLI_BROWSERS_PATH=/ms-playwright-cli
RUN sudo install -d -o ${USER_ID} -g ${GROUP_ID} ${WIKINO_PLAYWRIGHT_CLI_BROWSERS_PATH} && \
mise exec node@20.16.0 -- npm install -g @playwright/cli@${PLAYWRIGHT_CLI_VERSION} && \
mise exec node@20.19.0 -- npm install -g @playwright/cli@${PLAYWRIGHT_CLI_VERSION} && \
mise exec node@24.13.0 -- npm install -g @playwright/cli@${PLAYWRIGHT_CLI_VERSION} && \
mise reshim && \
PLAYWRIGHT_BROWSERS_PATH=${WIKINO_PLAYWRIGHT_CLI_BROWSERS_PATH} \
mise exec node@24.13.0 -- playwright-cli install-browser chromium
# --- Goのツール ---
ENV GOCACHE=/go/.cache/go-build
ENV GOMODCACHE=/go/pkg/mod
ENV GOPATH=/go
ENV PATH="${GOPATH}/bin:${PATH}"
RUN go install github.com/air-verse/air@latest
# --- Rubyのツール ---
RUN gem install bundler -v 2.5.16
# --- シェルの設定 ---
SHELL ["/bin/zsh", "-c"]
ENV SHELL=/bin/zsh
# --- Gitの設定 ---
RUN git config --global user.email "me@shimba.co" && \
git config --global user.name "Koji Shimba"
EXPOSE 8080 3000
CMD ["/bin/zsh"]