# Dockerによるパッケージング

Site [llms.txt](/ja/llms.txt)

---

多くの一般的なユースケースでは、有効な `artefacts.yaml` 設定ファイルがあれば、Artefactsは自動的に実行されます。これはArtefactsインフラストラクチャ上で実行する場合 (`run-remote`) と `artefacts run --in-container`を使用する場合の両方に適用されます。Artefactsインフラストラクチャ上でのジョブ実行の詳細については、 [cloud-simulation](/user-guide/cloud-simulation) を参照してください。

ArtefactsはカスタムのDockerファイル設定もサポートしています。このガイドではArtefactsでスムーズに実行するための条件について説明します。

## カスタムDockerfileまたはイメージ名を使用する場合

Artefactsクラウドシミュレーション (`run-remote`)上で実行する場合、または `artefacts run --in-container`を使用する場合、現在、以下の状況ではカスタム `Dockerfile` またはイメージを指定する必要があります：

* ROSを使用していない
* サポートされていないROSバージョンを使用している
* サポートされていないシミュレーターを使用している
* プロジェクトがプロジェクトリポジトリのsrcフォルダとは別の/追加のビルドステージを持っている
* プロジェクトに他の特定の要件がある
```yaml
my-job:
  type: test
  package:
    docker:
      build: # Sample with a custom Dockerfile. Another option is to specify an image.
        dockerfile: ./Dockerfile
```

Dockerfileの例は [nav2サンプルプロジェクト](https://github.com/art-e-fact/navigation2_ignition_gazebo_example/blob/main/Dockerfile) で確認できます。

## Artefactsベースイメージ

ROS2プロジェクトのベースレイヤーとして自由に使用できる多くのイメージを用意しています。これらのベースイメージには以下が含まれています：

* タグに対応するROSバージョン (例 `humble-fortress` には `ros-humble-ros-core` パッケージが含まれています)
* タグに対応するシミュレーター
* そのROS/シミュレーターの組み合わせに対してよく使用されるROS依存関係 (ROS2 Humble / Fortressベースイメージの `ros-humble-ros-ign-bridge` など)
* 必要なビルドツール (`catkin` / `colcon`)
* `rosdep` の初期化と更新
* Artefacts CLI
* `jazzy`（Ubuntu 24、Python 3.12）イメージでは、仮想環境が `/opt/venv` に既に設定されアクティブ化されています。`PYTHONPATH` 環境変数は、仮想環境の site-packages とシステムの dist-packages の両方を含むように事前に設定されています。これにより、ROS をソースした後でも、pip でインストールされたパッケージと ROS パッケージの両方が利用可能になります。その結果、Python 仮想環境を作成したり手動で設定したりする必要はありません。

公開されているベースイメージの完全なリストは [ECRパブリックレジストリ](https://gallery.ecr.aws/artefacts/ros2)で確認できます。以下の命名規則に従っています：

```
public.ecr.aws/artefacts/<framework>:<framework_version>-<simulator>-gpu
# -gpu is optional
# Examples:
public.ecr.aws/artefacts/ros2:humble-fortress
public.ecr.aws/artefacts/ros2:humble-fortress-gpu
```

> [!NOTE]
> `gpu` 対応イメージはartefactsインフラストラクチャ上で、NVIDIAのGPUで実行するように特別に設計されています。そのため、artefactsクラウドシミュレーション上で実行する際に追加の環境変数を設定する必要はありません。これらはamd64でのみ利用可能です（armでは利用できません）。
> ローカルで実行している場合は、NVIDIA Container Toolkitをインストールし、いくつかの環境変数（'ENV'）を設定する必要があるかもしれません。詳細については、NVIDIAの [インストールガイド](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) と [ユーザガイド](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/user-guide.html) を参照してください。

これらのベースイメージを使用することで、プロジェクトのDockerfileは（最低限）以下の手順を実行する必要があります：

* プロジェクトファイルをコピーする
* ROS依存関係をインストールする
* プロジェクトをビルドする
* artefactsクライアントを実行する

例として、ROS2 Humble / Ignition Fortressプロジェクトのartefactsで動作するDockerfileは以下のようになります：
```docker
# Use the artefacts ROS2 humble base image
FROM public.ecr.aws/artefacts/ros2:humble-fortress

# Set the working directory and copy our project
WORKDIR /ws
COPY . /ws/src

# ROS dependencies
RUN rosdep install --from-paths src --ignore-src -r -y
# Source ROS version and build
RUN . /opt/ros/galactic/setup.sh && colcon build --symlink-install

WORKDIR /ws/src

# Source colcon workspace and run the artefacts client
CMD . /ws/install/setup.sh && artefacts run $ARTEFACTS_JOB_NAME
```

## Dockerfileの要件

現在、Dockerfileは2つの要件を満たす必要があります：

* CLIをインストールする必要があります（artefactsが提供するベースイメージには既にインストールされています）
```
RUN pip install artefacts-cli
```
* コンテナ起動コマンドはCLIを実行する必要があります：
```
CMD artefacts run $ARTEFACTS_JOB_NAME
```

これは `artefacts run <job_name> --in-container` (ローカル) または `artefacts run-remote <job_name>` (クラウドシミュレーション)で実行できます。
