> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ale.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Dockerfile

> エールのDockerfileテンプレートを活用して、Dockerfileを簡単にデプロイできます。

<Info>
  エールのテンプレート/プリセットは、効率的なリソース管理のため、最小限のライブラリのみを使用します。<Icon icon="windows" size={15} color="9fa3a5" /> **Windows、** <Icon icon="chrome" size={15} color="9fa3a5" /> **Chrome**ライブラリなど、デフォルトで提供されていないライブラリを使用する場合は、[サンプルコード](/ja/developers/dockerfile#%E8%A8%80%E8%AA%9E%E5%88%A5%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)を参考にDockerfileを作成してデプロイしてください。
</Info>

***

## リポジトリとテンプレートの選択

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_01.png" />
</Frame>

> ダッシュボードの <Icon icon="circle-plus" iconType="solid" size={15} color="2396F1" />または `⌘ + K` で生成されるデプロイモーダルで **Dockerfile**テンプレートを選択し、続くドロップダウンメニューから連携されたGitHubアカウントのリポジトリを選択するか、[Git URLタブでGitリポジトリURLを入力してください。](/ja/developers/private-repo)

## デプロイ設定とデプロイ

### 基本設定

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_02.png" />
</Frame>

* **Environment variables(ENV)** : コンテナ実行時に参照される環境変数

* **Build arguments(ARG)** : イメージビルド時に参照される引数

* **Port** : コンテナが実行されるポート。`docker run` の `-p, --publish` オプションに対応

* **Health Check** : コンテナの状態を検証するエンドポイント

* **Start commands** : コンテナ起動コマンド

### 詳細オプション

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_03.png" />
</Frame>

* **Dockerfile text** : Dockerfileの全内容を入力

* **Build Labels(LABEL)** : ビルドする際のバージョン、ライセンスなどの追加情報

* **uid** : コンテナでプロセスを実行するユーザーの固有識別子（デフォルト値1000）

* **gid** : コンテナでプロセスが属するグループの固有識別子（デフォルト値1000）

* **Update strategy**

  * **Rolling Update** : 新バージョンをデプロイ後、既存ポッドを終了。可用リソース確保必要

  * **Recreate** : 既存ポッドを終了後、新バージョンを作成・起動。ダウンタイム発生

* **Shell** : コンテナ実行後に実行するシェル（sh、bash、zshなど）

### リソース設定とデプロイ

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_04.png" />
</Frame>

* **リソースタイプ**：[オンデマンドとスポットリソース](/ja/developers/resource#on-demand-spot)から選択

* **CPU**：サービスで利用可能なvCPUの上限を設定。最小構成時は0.1 vCPUを割り当て

* **メモリ**：サービスで利用可能なメモリの上限を設定

* [レプリカ](/ja/developers/replica)：設定した数に応じサービスを水平スケーリングし、負荷分散と可用性確保

* **デプロイ**：`デプロイ`をクリック

<Tip>
  リソース制限によりデプロイできない場合は、[スペースとリソースの管理ページ](/ja/operations/spaces#%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E4%BB%98%E4%B8%8E)を参照してスペースにリソースを追加してください。
</Tip>

## ログとターミナル

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_05.png" />
</Frame>

> サービスカードまたはサービスページの<Icon icon="terminal" size={15} color="9fa3a5" />アイコンをクリックすると、デプロイ/実行ログの確認やターミナルへのアクセスできます。

## メトリクス

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_06.png" />
</Frame>

> サービスページのメトリクスタブでサービスのメトリクスを確認できます。

## 再デプロイ（更新）

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_07.png" />
</Frame>

> コードの変更やリソース設定の更新がある場合は、サービスページの設定タブ下部にあるデプロイボタンをクリックして、変更を反映した新しいデプロイを実行できます。

<Tip>
  デプロイ自動化のためのGitHub Actions適用については、[GitHub Actionsページ](/ja/developers/githubactions)をご参照ください。
</Tip>

## ロールバック（復元）

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ja/08_08.png" />
</Frame>

> **サービスページのデプロイ履歴タブ**から、以前のバージョンへロールバックできます。

<Tip>
  ロールバック前に、対象バージョンのコミットメッセージを必ず確認してください。
</Tip>

## 言語別サンプルコード

<AccordionGroup>
  <Accordion title="Node.js - Express">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/docker-node-be)

    ````dockerfile theme={null}
    # 依存関係のインストール
    FROM node:16-buster
    WORKDIR /app
    COPY package*.json ./ 
    RUN npm ci --only=production

    ENV NODE_ENV production

    COPY . .

    # nodeイメージには既に"node"というユーザーがuid/gid 1000番で作成されています
    USER node

    EXPOSE 3000
    CMD ["npm", "start"]
    </Accordion>
    <Accordion title="React">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/docker-node-fe)
    ```dockerfile
    # プロジェクトビルド
    FROM node:16-buster AS builder
    WORKDIR /app
    COPY package*.json .
    RUN npm ci
    COPY . .
    RUN npm run build

    # Production ランタイム - nginx
    FROM nginxinc/nginx-unprivileged:1.23 AS runner
    WORKDIR /usr/share/nginx/html
    COPY --from=builder /app/build .

    EXPOSE 3000
    CMD ["nginx", "-g", "daemon off;"]
    ````
  </Accordion>

  <Accordion title="Python Flask">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/docker-python)

    ```dockerfile theme={null}
    FROM python:3.9-slim-buster

    ENV PYTHONDONTWRITEBYTECODE=1
    ENV PYTHONUNBUFFERED 1

    ARG UID=1000
    ARG GID=1000

    RUN groupadd -g "${GID}" python \
      && useradd --create-home --no-log-init -u "${UID}" -g "${GID}" python
    WORKDIR /home/python

    COPY --chown=python:python requirements.txt requirements.txt
    RUN pip3 install -r requirements.txt

    # USERの変更は必ずpipパッケージインストールスクリプトの後に記述する必要があります
    USER python:python
    ENV PATH="/home/${USER}/.local/bin:${PATH}"
    COPY --chown=python:python . .

    ARG FLASK_ENV

    ENV FLASK_ENV=${FLASK_ENV}

    EXPOSE 5000

    # WSGI、ポート番号、モジュール名などは各ソースコードに合わせて修正してデプロイを進めてください
    CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
    ```
  </Accordion>

  <Accordion title="Spring Boot">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/springboot-crud-example)

    ```dockerfile theme={null}
    # JDKイメージを使用した実行可能jarのビルド
    FROM eclipse-temurin:17-alpine AS build
    RUN apk add --no-cache bash

    WORKDIR /app

    COPY gradlew .
    COPY gradle gradle
    COPY build.gradle settings.gradle ./
    # COPY build.gradle.kts settings.gradle.kts ./    Kotlinの場合は.kts拡張子を適用

    RUN ./gradlew dependencies --no-daemon

    COPY . .

    RUN chmod +x ./gradlew

    RUN ./gradlew bootJar --no-daemon

    # jar実行用のJREイメージ適用
    FROM eclipse-temurin:17-jre-alpine
    WORKDIR /app

    RUN addgroup -g 1000 worker && \
        adduser -u 1000 -G worker -s /bin/sh -D worker

    COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar

    USER worker:worker

    EXPOSE 8080

    ENTRYPOINT ["java", "-jar", "main.jar"]
    ```
  </Accordion>

  <Accordion title="Spring Boot(マルチモジュール)">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/spring-multi-module)

    ```dockerfile theme={null}
    # JDKイメージを使用した実行可能jarのビルド
    FROM eclipse-temurin:17-alpine AS build
    RUN apk add --no-cache bash

    WORKDIR /app

    COPY gradlew .
    COPY gradle gradle
    COPY build.gradle settings.gradle ./
    # COPY build.gradle.kts settings.gradle.kts ./    Kotlinの場合は.kts拡張子を適用

    RUN ./gradlew dependencies --no-daemon

    COPY . .

    RUN chmod +x ./gradlew

    RUN ./gradlew bootJar :api:bootJar --no-daemon
    # RUN ./gradlew bootJar :<メインモジュール名>:bootJar --no-daemon

    # jar実行用のJREイメージ適用
    FROM eclipse-temurin:17-jre-alpine
    WORKDIR /app

    RUN addgroup -g 1000 worker && \
        adduser -u 1000 -G worker -s /bin/sh -D worker

    COPY --from=build --chown=worker:worker /app/api/build/libs/*.jar ./main.jar
    # COPY --from=build --chown=worker:worker /app/<メインモジュール名>/build/libs/*.jar ./main.jar

    USER worker:worker

    EXPOSE 8080

    ENTRYPOINT ["java", "-jar", "main.jar"]
    ```
  </Accordion>

  <Accordion title="Spring Boot CRUD App(Gradle)">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/springboot-crud-gradle)

    ```dockerfile theme={null}
    # ビルド
    FROM eclipse-temurin:17-alpine AS build
    RUN apk add --no-cache bash

    WORKDIR /app

    COPY gradlew .
    COPY gradle gradle
    COPY build.gradle.kts settings.gradle.kts ./

    RUN ./gradlew dependencies --no-daemon

    COPY . .

    RUN chmod +x ./gradlew

    RUN ./gradlew build --no-daemon -x test


    # ランタイム
    FROM eclipse-temurin:17-jre-alpine AS runtime
    WORKDIR /app

    RUN addgroup -g 1000 worker && \
        adduser -u 1000 -G worker -s /bin/sh -D worker

    COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar

    USER worker:worker

    ENV PROFILE=${PROFILE}

    EXPOSE 8080

    ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]
    ```
  </Accordion>

  <Accordion title="Spring Boot CRUD App(Maven)">
    [Githubリポジトリへ移動](https://github.com/cloudtype-examples/springboot-crud-maven)

    ```dockerfile theme={null}
    # ビルド
    FROM eclipse-temurin:17-alpine AS build
    RUN apk add --no-cache bash

    WORKDIR /app

    COPY mvnw .
    COPY .mvn .mvn
    COPY pom.xml .

    RUN ./mvnw dependency:go-offline -B

    COPY . .

    RUN chmod +x ./mvnw

    RUN ./mvnw package -DskipTests


    # ランタイム
    FROM eclipse-temurin:17-jre-alpine as runtime

    WORKDIR /app

    RUN addgroup -g 1000 worker && \
        adduser -u 1000 -G worker -s /bin/sh -D worker

    COPY --from=build --chown=worker:worker /app/target/*.jar ./main.jar

    USER worker:worker

    ENV PROFILE=${PROFILE}

    EXPOSE 8080

    ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]
    ```
  </Accordion>
</AccordionGroup>
