zeabur-dockerfile について
プロジェクトを分析し、Zeabur へのソースコードデプロイ用 Dockerfile を作成するためのスキルです。言語やフレームワーク別のルールに加え、静的サイト、既存 Dockerfile の確認、一般的なデプロイ問題を扱います。
主な機能
- 01プロジェクト設定と依存ファイルの確認
- 02言語、フレームワーク、起動コマンドの特定
- 03プロジェクト種別に応じた Dockerfile 作成
- 04既存 Dockerfile の確認とラベル追加
- 05Zeabur デプロイコマンドとトラブル対応
活用シーン
- 01アプリのソースを Zeabur デプロイ向けに準備
- 02静的サイトに適したコンテナイメージの選択
- 03ポートや起動コマンドの設定問題を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ zeabur/ agent-skills --skill zeabur-dockerfileインストール後、Claude Code で/zeabur-dockerfileを入力して読み込まれたか確認します。
詳細
Zeabur Dockerfile の生成
Zeabur CLI の実行には、必ず
npx zeabur@latestを使用してください。zeaburを直接実行したり、ほかの方法でインストールしたりしないでください。npxが利用できない場合は、先に Node.js をインストールしてください。
ソースコードを Zeabur にデプロイするときは、Dockerfile を生成する必要があります。このスキルでは、プロジェクトを分析し、正しくデプロイ可能な Dockerfile を作成する方法を説明します。
前提条件
Dockerfile を生成する前に、主要なプロジェクトファイルを確認してください。
| 言語 | 確認するファイル |
|---|---|
| Node.js | package.json、ロックファイル(package-lock.json / yarn.lock / pnpm-lock.yaml) |
| Python | requirements.txt、Pipfile、pyproject.toml |
| Go | go.mod |
| Rust | Cargo.toml |
| PHP | composer.json |
| Ruby | Gemfile |
| Java | pom.xml、build.gradle |
| .NET | *.csproj、*.sln |
| Elixir | mix.exs |
次のファイルも確認してください。
- 既存の
Dockerfileまたはdocker-compose.yml - ビルド設定(
vite.config.js、webpack.config.js、next.config.jsなど) - 必要な環境変数を確認できる
.env.example
読まなくてよいもの — トークンを節約するため、次のファイルは確認しないでください。
- HTML ファイル — 静的アセットであり、デプロイのロジックには影響しません
- ロックファイルの内容 — パッケージマネージャーを特定するため、存在するロックファイルだけを確認してください。内容は解析しないでください。
- Markdown ファイル — ドキュメントであり、Dockerfile の判断には影響しません
ワークフロー
1. プロジェクトを分析する
前提条件に記載したファイルから、次の情報を特定します。
- プログラミング言語とバージョン
- フレームワーク(使用している場合)
- パッケージマネージャー
- ビルドコマンド
- 起動コマンド
- アプリがリッスンするポート
- 静的サイトかサーバーサイドアプリか
2. Dockerfile を生成する
一般的なルール
- Dockerfile にコメントを記述しないでください
ENVまたはARG命令を使用しないでください(フレームワークで必要な場合を除きます。言語別のセクションを参照してください)LABEL "language"="<lang>"を追加してください。指定できる値はnodejs、python、go、static、ruby、java、php、rust、dotnet、elixir、swift、bunですLABEL "framework"="<framework>"を追加するのは、実際の Web フレームワークの場合に限ります(下記の一覧を参照)- インストールまたはビルドコマンドを実行する前に、必ず
COPY . .を記述してください - ユーザーから別の指定がない限り、
WORKDIR /srcを設定してください - アプリがリッスンするポートに対して
EXPOSEを追加してください - ビルドイメージと実行イメージが異なる場合(例:Node.js でビルドし、
zeabur/caddy-staticで配信する場合)を除き、マルチステージビルドは使用しないでください
フレームワークとパッケージ — フレームワークラベルを付けるのは以下のみ
フレームワーク(LABEL "framework"="..." を使用):
vite、create-react-app、next.js、remix、nuxt.js、umi、nest.js、hexo、vitepress、astro、sli.dev、docusaurus、nitropack、hono、medusa、svelte、flask、django、fastapi、spring-boot、laravel、thinkphp、rails、aspnet、blazorwasm、elysia、baojs
フレームワークとしてラベルを付けないでください(これらはパッケージ/ライブラリです)。
- Python:gradio、pandas、numpy、requests、matplotlib、scikit-learn、tensorflow、pytorch、opencv、pillow、beautifulsoup4、selenium
- Node.js:express、koa、hapi、fastify、socket.io、moment、lodash、axios
- その他:bootstrap、jquery、chart.js、three.js、d3.js
フレームワークかパッケージか判断できない場合は、フレームワークラベルを追加しないでください。
静的サイト — zeabur/caddy-static
純粋な静的ウェブサイト(Vite、静的な Astro、Docusaurus、プレーンな HTML)には、zeabur/caddy-static を使用してください。
FROM node:22-slim AS build
LABEL "language"="nodejs"
LABEL "framework"="vite"
WORKDIR /src
COPY . .
RUN npm install
RUN npm run build
FROM zeabur/caddy-static
COPY --from=build /src/dist /usr/share/caddy
zeabur/caddy-static のルール:
- ビルド出力を
/usr/share/caddyにコピーしてください CMDまたはENTRYPOINTを追加しないでください — イメージが処理します- ポート
8080でリッスンします - 真に静的なサイトにのみ使用してください。SSR フレームワーク(Next.js、Nuxt.js、SvelteKit など)には使用しないでください
- Node.js でビルドして静的サイトとして配信する場合は、
LABEL "language"="static"ではなくLABEL "language"="nodejs"を設定してください
Node.js
- デフォルトのベースイメージ:
node:22-slim - ロックファイルの有無でパッケージマネージャーを判断します。
| ロックファイル | パッケージマネージャー | インストールコマンド |
|---|---|---|
package-lock.json | npm | npm install |
yarn.lock | yarn | yarn install |
pnpm-lock.yaml | pnpm | RUN npm install -g pnpm && pnpm install |
npmを使用する場合は、npm installを使用してください。npm ciや--only=production、--omit=dev、--frozen-lockfileなどのフラグは使用しないでください。- Vite の静的サイト(React、Vue の静的ビルド)には、配信に
zeabur/caddy-staticを使用してください。 - SSR フレームワーク(SvelteKit)を使った Vite には、Node.js ランタイムを使用してください。
Next.js — Zeabur はコンテナに PORT=8080 を注入するため、Next.js の本番モードはデフォルトで 8080 で待ち受けます。追加の設定は不要です。
FROM node:22-slim
LABEL "language"="nodejs"
LABEL "framework"="next.js"
WORKDIR /src
COPY . .
RUN npm install
RUN npm run build
EXPOSE 8080
CMD ["npm", "start"]
Svelte / SvelteKit — node:22(alpine でも slim でもないもの)を使用してください。ENV PORT=8080 を設定します。シングルステージビルドを使用してください。zeabur/caddy-static は使用しないでください。cross-env ADAPTER=static やアダプター固有のビルドコマンドも使用しないでください。
FROM node:22
LABEL "language"="nodejs"
LABEL "framework"="svelte"
ENV PORT=8080
WORKDIR /src
RUN npm install -g pnpm@9
COPY . .
RUN pnpm install
RUN pnpm build
EXPOSE 8080
CMD ["pnpm", "start"]
Python
- デフォルトのベースイメージ:
python:3.10
Flask — まず WSGI エントリーポイントを確認してください。たとえば、main.py に app = Flask(__name__) が含まれている場合、エントリーポイントは main:app です。
FROM python:3.10
LABEL "language"="python"
LABEL "framework"="flask"
WORKDIR /src
COPY . .
RUN pip install -r requirements.txt gunicorn
EXPOSE 8080
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:app"]
FastAPI — 存在するものに基づいて起動方法を選択します。
requirements.txtにfastapi-cliがある場合 →fastapi run.pyファイルにif __name__ == "__main__":がある場合 →python <file>.py- それ以外の場合 →
uvicorn main:app --host 0.0.0.0 --port 8080(uvicornがない場合はインストールします)
FROM python:3.10
LABEL "language"="python"
LABEL "framework"="fastapi"
WORKDIR /src
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
汎用 Python — WSGI が適用できる可能性がある場合は、gunicorn を使用してください。不明な場合は、python <file>.py を使用してください。
Go
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN go build -o /app .
FROM debian:bookworm-slim
LABEL "language"="go"
COPY --from=build /app /app
EXPOSE 8080
CMD ["/app"]
PHP(Laravel / Symfony / 汎用)
NGINX + PHP-FPM を使用します。必要に応じて PHP のバージョンと拡張機能を調整してください。
FROM php:8.3-fpm
LABEL "language"="php"
WORKDIR /var/www
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && sync
RUN apt update && apt install -y cron curl gettext git grep libicu-dev nginx pkg-config unzip && rm -rf /var/lib/apt/lists/*
RUN install-php-extensions @composer apcu bcmath gd intl mysqli opcache pcntl pdo_mysql sysvsem zip
RUN cat <<'NGINX' > /etc/nginx/sites-enabled/default
server {
listen 8080;
root /var/www;
index index.php index.html;
charset utf-8;
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ /\.(?!well-known).* { deny all; }
error_log /dev/stderr;
access_log /dev/stderr;
}
NGINX
RUN chown -R www-data:www-data /var/www
COPY --chown=www-data:www-data . /var/www
USER www-data
RUN if [ -f composer.json ]; then composer install --optimize-autoloader --classmap-authoritative --no-dev; fi && if [ -f package.json ]; then npm install; fi
USER root
EXPOSE 8080
CMD ["sh", "-c", "php-fpm -D && nginx -g 'daemon off;'"]
Laravel の場合は、composer install の後に最適化を追加してください。
RUN php artisan config:cache && php artisan route:cache && php artisan view:cache
3. 既存の Dockerfile を扱う
- まず既存の Dockerfile を分析します
- 適切であれば、そのまま使用します
- 問題がある場合(ポートの誤り、依存関係の不足など)にのみ、改善を提案します
- Zeabur 固有のラベル(
language、framework)がない場合は、必ず追加します
CLI コマンド
Dockerfile を生成した後、次のコマンドでデプロイします。
npx zeabur@latest deploy --project-id <project-id> --json
再デプロイする場合(重複を作成しないよう、サービス ID を必ず渡してください):
npx zeabur@latest deploy --project-id <project-id> --service-id <service-id> --json
デプロイのワークフロー全体については、zeabur-deploy スキルを使用してください。
エラー処理
ビルドまたはランタイムで失敗した場合:
zeabur-deployment-logsスキルでビルドログを確認します- よくある問題:
- 依存関係の不足 —
RUNのインストール手順に追加します - ポートの誤り —
EXPOSEがアプリの待ち受けポートと一致することを確認します。zeabur-port-mismatchスキルで確認してください - 起動コマンドの誤り —
CMDがプロジェクトの実際のエントリーポイントと一致することを確認します - 静的サイトを SSR として配信している — アプリが静的出力を生成する場合は、
zeabur/caddy-staticに切り替えます - SSR を静的サイトとして配信している — アプリがサーバーを必要とする場合は、Node.js ランタイムに切り替えます
- 依存関係の不足 —
- Dockerfile を修正し、
--service-idを指定して再デプロイし、既存のサービスを更新します