Dockerイメージの作成

measurementプロジェクトのアプリケーション開発における、Dockerイメージの作成について説明します。

../../../_images/develop_application_measurement_project_overview_docker_image.png

図 28 本章での説明部分(黄色枠)

デバイスコネクターの開発 で作成したプラグインおよびパイプライン設定ファイルを含めたDockerイメージを作成し、コンテナレジストリへpushする方法を説明します。 また、デバイスコネクターサービスファイルを作成し、作成したDockerイメージを使ってエッジコンピューターで計測の動作確認を行います。

コンテナレジストリの準備

Dockerイメージを保存するため、Docker Hub、Amazon Elastic Container Registry(ECR)、Google Container Registry(GCR)などのコンテナレジストリの準備が必要です。

あらかじめ、イメージを保存するためのリポジトリを作成してください。 また、プライベートリポジトリの場合は、事前に docker login または Docker Credential Helpers を利用してログインしてください。

Dockerfileの作成

Terminal System 2の推奨開発方法では、以下の点を考慮してDockerfileを作成する必要があります。

ベースイメージ

FROM で、使用するベースイメージを指定します。 device-connector-intdashの動作要件を満たしている、 debianubuntu をベースイメージにしたイメージを選択してください。

device-connector-intdashパッケージのインストール

aptリポジトリの設定を行いdevice-connector-intdashパッケージをダウンロードおよびインストールします。

プラグインおよびパイプライン設定ファイルのコピー

プラグインおよびパイプライン設定ファイルをDockerイメージに含めます。

以下に、 ubuntu:22.04 ベースイメージを利用し、前章の デバイスコネクターの開発 でビルドしたプラグインやパイプライン設定ファイルを含むDockerfileを作成する例を示します。

  1. 前章で作成したプロジェクトディレクトリに移動します。

    $ cd custom
    
  2. プロジェクトのディレクトリに Dockerfile.image ファイルを以下の内容で作成します。

    FROM ubuntu:22.04 AS download
    
    # setup intdash-edge repository
    RUN apt-get update && apt-get install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        lsb-release \
        && apt-get clean && rm -rf /var/lib/apt/lists/*
    RUN mkdir -p /etc/apt/keyrings
    RUN curl -fsSL https://repository.aptpod.jp/intdash-edge/linux/ubuntu/gpg | \
        gpg --dearmor -o /etc/apt/keyrings/intdash-edge.gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/intdash-edge.gpg] \
        https://repository.aptpod.jp/intdash-edge/linux/ubuntu \
        $(lsb_release -cs) \
        stable" \
        | tee /etc/apt/sources.list.d/intdash-edge.list
    
    # download latest device-connector-intdash package
    RUN apt-get update && apt-get download device-connector-intdash \
        && apt-get clean && rm -rf /var/lib/apt/lists/*
    
    FROM ubuntu:22.04
    COPY --from=download /device-connector-intdash_*.deb /
    
    # install device-connector-intdash
    RUN apt-get update && apt-get install -y --no-install-recommends \
        /device-connector-intdash_*.deb \
        && rm -f /device-connector-intdash_*.deb \
        && apt-get clean && rm -rf /var/lib/apt/lists/*
    
    # copy plugins
    COPY target /files
    ARG TARGETPLATFORM
    RUN case ${TARGETPLATFORM} in \
        "linux/amd64")  export TARGET="x86_64-unknown-linux-gnu" ;; \
        "linux/arm64")  export TARGET="aarch64-unknown-linux-gnu" ;; \
        "linux/arm/v7") export TARGET="armv7-unknown-linux-gnueabihf" ;; \
        esac \
        && cp /files/$TARGET/release/libdc_*.so /usr/local/lib/ \
        && rm -rf /files
    
    # copy config
    COPY conf/*.yml /etc/dc_conf/custom/
    
    ENTRYPOINT ["/usr/bin/device-connector-intdash"]
    

以下に、Dockerfileの内容を説明します。

FROM ubuntu:22.04 AS download

FROM でベースイメージに ubuntu:22.04 を指定しています。 実行時に不要なパッケージを除外するため、マルチステージビルドを行います。 device-connector-intdashパッケージをダウンロードするため、 AS download でdownloadステージとしてビルドします。

# setup intdash-edge repository
RUN apt-get update && apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    lsb-release \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://repository.aptpod.jp/intdash-edge/linux/ubuntu/gpg | \
    gpg --dearmor -o /etc/apt/keyrings/intdash-edge.gpg
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/intdash-edge.gpg] \
    https://repository.aptpod.jp/intdash-edge/linux/ubuntu \
    $(lsb_release -cs) \
    stable" \
    | tee /etc/apt/sources.list.d/intdash-edge.list

ubuntu 向けに、device-connector-intdashパッケージのaptリポジトリを設定しています。

# download latest device-connector-intdash package
RUN apt-get update && apt-get download device-connector-intdash \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

ビルド時点で最新のdevice-connector-intdashをダウンロードします。 最新のTerminal System 2向けに開発する場合は最新バージョンで問題ありません。古いバージョンを指定する場合は、 device-connector-intdash=<バージョン> としてください。

FROM ubuntu:22.04
COPY --from=download /device-connector-intdash_*.deb /

新しいステージを作成し、downloadステージでダウンロードしたdevice-connector-intdashパッケージをコピーします。

# install device-connector-intdash
RUN apt-get update && apt-get install -y --no-install-recommends \
    /device-connector-intdash_*.deb \
    && rm -f /device-connector-intdash_*.deb \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

device-connector-intdashパッケージをインストールします。 --no-install-recommends を指定して、実行に必須ではない推奨パッケージのインストールを省いています。

警告

no-install-recommends を指定した場合、推奨パッケージを利用する以下のエレメントを利用できません。 これらのエレメントをパイプラインで利用したい場合は、aptリポジトリ設定を行い --no-install-recommends を指定せずにdevice-connector-intdashをインストールしてください。

  • apt-analogtrx-src

  • apt-cantrx-src

  • h264-split-filter

  • pcm-split-filter

  • apt-cantrx-sink

# copy plugins
COPY target /files
ARG TARGETPLATFORM
RUN case ${TARGETPLATFORM} in \
    "linux/amd64")  export TARGET="x86_64-unknown-linux-gnu" ;; \
    "linux/arm64")  export TARGET="aarch64-unknown-linux-gnu" ;; \
    "linux/arm/v7") export TARGET="armv7-unknown-linux-gnueabihf" ;; \
    esac \
    && cp /files/$TARGET/release/libdc_*.so /usr/local/lib/ \
    && rm -rf /files

ターゲットプラットフォームに応じて、ビルドしたプラグインを /usr/loca/lib/ にコピーします。 TARGETPLATFORM は、後述するDockerイメージのビルド時に値を設定します。

# copy config
COPY conf/*.yml /etc/dc_conf/custom/

conf/*.yml にあるパイプライン設定ファイルを、 /etc/dc_conf/custom/ にコピーします。

ENTRYPOINT ["/usr/bin/device-connector-intdash"]

実行ファイルとしてdevice-connector-intdashを指定します。

イメージのビルドとpush

Docker Buildx を利用して、以下の手順でマルチプラットフォームのイメージをビルドします。

  1. 前章で作成したプロジェクトディレクトリに移動します。

    $ cd custom
    
  2. QEMUのユーザースペースエミュレーションを設定します。

    $ docker run --privileged --rm tonistiigi/binfmt --install all
    
  3. ビルダーインスタンスを作成します。

    $ docker buildx create --use --name mybuild
    
  4. Dockerイメージをビルドします。 タグを指定しない場合、イメージはビルドキャッシュにのみ保存されます。

    • --file 使用するDockerfileのファイル名を指定します

    • --platform ビルド対象のプラットフォームを指定します(複数指定可能)

    • --pull ビルド前にベースイメージをpullします

    例: linux/arm64 プラットフォーム向けにビルドする場合

    $ docker buildx build \
       --file Dockerfile.image \
       --platform linux/arm64 \
       --pull \
       .
    

    注釈

    エッジコンピューターのアーキテクチャは、エッジコンピューターで uname -m コマンドを実行すると確認できます。 ターゲットアーキテクチャと uname -m コマンドの対応関係は以下のとおりです。

    • linux/arm64: aarch64

    • linux/arm/v7: armv7l

    • linux/amd64: x86_64

  5. Dockerイメージがビルドできることが確認できたら、レジストリにpushします。

    DockerHubの場合、イメージ名( <image name> )はユーザー名/リポジトリ名の形式で指定します。

    例: username/hello-custom

    • --push ビルド後にイメージをpushします

    • --tag イメージ名とタグを指定します

    $ export IMAGE=<image name>:<tag>
    $ docker buildx build \
       --file Dockerfile.image \
       --platform linux/arm64 \
       --pull \
       --push \
       --tag $IMAGE \
       .
    

    注意

    計測時に利用するDockerイメージを固定したい場合はバージョンを示すタグを、 常に最新のバージョンを利用したい場合は latest などのタグを指定することを推奨します。

アーカイブの作成 (プライベートリポジトリ利用時のみ)

プライベートリポジトリを利用する場合、本番環境にデプロイするためにアーカイブを作成する必要があります。

注釈

プライベートリポジトリを利用しない場合は本手順は実施不要です。 また、プライベートリポジトリ利用していても、開発時の場合は docker login または Docker Credential Helpers を利用してログインするため、本手順の実施は任意です。

アーカイブを作成するには以下の2つの方法があります。

  1. 手動でアーカイブを作成する

  2. プリインストールイメージの設定を追加した後、OS開発の setup_layer.sh スクリプトを実行する ( OS開発 を参照 )

ここでは、手動でアーカイブを作成する方法を説明します。

  1. 前手順でレジストリにpushしたマルチアーキテクチャイメージのダイジェスト値( "digest" )を確認します。

    $ export IMAGE_NAME=<image name>
    $ export IMAGE=${IMAGE_NAME}:<tag>
    $ docker manifest inspect $IMAGE
    

    例:

    • linux/arm64: sha256:d0c85457494c692bc53a61377cbf6568a35df08385fcc492353b0bd40ada1bc1

    {
       "mediaType": "application/vnd.oci.image.manifest.v1+json",
       "size": 1440,
       "digest": "sha256:d0c85457494c692bc53a61377cbf6568a35df08385fcc492353b0bd40ada1bc1",
       "platform": {
          "architecture": "arm64",
          "os": "linux"
       }
    }
    
  2. アーカイブを作成したいアーキテクチャのダイジェストを利用して、イメージをpullします。

    例:

    • linux/arm64のダイジェストを利用してpull

    $ export DIGEST="sha256:d0c85457494c692bc53a61377cbf6568a35df08385fcc492353b0bd40ada1bc1"
    $ docker pull ${IMAGE_NAME}@${DIGEST}
    
  3. pullしたイメージにタグを付けます。

    $ export IMAGE_ID=$(docker images --digests | grep ${DIGEST} | head -n 1 | awk {'print $4'})
    $ docker tag $IMAGE_ID $IMAGE
    
  4. アーカイブを作成します。名称は任意ですが、イメージ名とタグを含めることを推奨します。

    $ docker save ${IMAGE} | gzip > "<image name>_<tag>.tar.gz"
    

作成したプライベートリポジトリのDockerイメージのアーカイブは、 アーティファクトの作成 でエッジコンピューターにイメージをデプロイする際に利用します。

イメージの動作確認

エッジコンピューターにログインし、Dockerイメージを利用したコンテナが動作することを確認します。 プライベートリポジトリの場合は、事前に docker login または Docker Credential Helpers を利用してログインしてください。

重要

プライベートリポジトリを利用する場合、開発時の動作確認を除いて、本番環境で認証情報をエッジデバイスに保存することは避けてください。認証情報が漏洩した場合、悪意のあるユーザーが不正にアクセスする可能性があります。

本番環境のエッジコンピューターにプライベートリポジトリのDockerイメージをデプロイする場合は、Dockerイメージをアーカイブ化したものをプリインストールイメージに含めるか、アプリケーションアップデートアーティファクトに含めてデプロイする方法を推奨します。詳細については、 アーティファクトの作成 を参照してください。

  1. エッジコンピューターで、イメージをpullします。

    $ export IMAGE=<image name>:<tag>
    $ docker pull $IMAGE
    
  2. デバイスコネクターの開発 で作成したパイプライン設定ファイル custom-text-hexdump.yml を指定し、device-connector-intdashを実行します。 カスタムインベントリを送信する場合は、 -v オプションで /var/run/device-inventory/custom.d をバインドマウントします。

    $ docker run --rm \
      --env "DC_TEXT=Hello, world!" \
      -v /var/run/device-inventory/custom.d:/var/run/device-inventory/custom.d \
      "$IMAGE" --config /etc/dc_conf/custom/custom-text-hexdump.yml
    
    [2023-05-11T09:51:36Z INFO  device_connector_common] dc_init() (dc_custom)
    [2023-05-11T09:51:36Z INFO  device_connector::process] start background processes
    [2023-05-11T09:51:36Z INFO  device_connector::process] execute before script
    [2023-05-11T09:51:36Z INFO  dc_intdash::basetime] clock id is "CLOCK_MONOTONIC"
    [2023-05-11T09:51:36Z INFO  device_connector::runner] spawn task 3
    msg = 1F 95 00 00 27 1A 9A 26 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 1F 95 00 00 15 96 92 2C 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 1F 95 00 00 64 A3 8A 32 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 1F 95 00 00 72 65 83 38 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 20 95 00 00 40 F5 E0 02 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 20 95 00 00 8F FA D8 08 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    msg = 20 95 00 00 7E FA D0 0E 06 00 0B 00 05 00 00 00 73 74 72 69 6E 67 63 75 73 74 6F 6D 5F 74 65 78 74 48 65 6C 6C 6F
    

    環境変数 DC_TEXT=Hello で指定した文字列が、string型のiscp-v2-compatフォーマットに変換され、16進数でダンプ出力されることが確認できました。

    カスタムインベントリを作成している場合は、以下のファイルが生成されます。カスタムインベントリは、Menderサーバーへのインベントリ送信や、Device Inventoryデバイスコネクターサービスでintdashサーバーに送信されます。

    $ cat /var/run/device-inventory/custom.d/custom-text
    {"text": "Hello, world!"}
    

デバイスコネクターサービスファイルの作成

measurementプロジェクトのコンテナとして動作させるため、デバイスコネクターサービスファイルを作成します。

  1. 例として、 Custom Text.yml という名前のデバイスコネクターサービスファイルを作成します。以下の内容を記述してください。

    image: <image name>:<tag>
    command:
        - --config
        - "/etc/dc_conf/custom/custom-text.yml"
    depends_on:
        intdash-edge-agent2:
            condition: service_healthy
    volumes:
        - /var/run/core/intdash:/var/run/intdash
        - /var/run/device-inventory/custom.d:/var/run/device-inventory/custom.d
    restart: unless-stopped
    environment:
        DC_FILE_SINK_CONF_PATH: ${DC_UPSTREAM_FIFO_0}
        DC_PRINT_LOG_FILTER_CONF_TAG: ${DC_TAG}
        DC_TEXT: ${DC_TEXT}
    substitution_variables:
        - key: DC_UPSTREAM_FIFO_0
          default: ""
          validation: "^/var/run/intdash/"
          display_strings_i18n:
            - locale: jpn
              name: FIFO Path
              description: intdash Edge Agent 2へデータを送信するためのFIFOのパス
        - key: DC_TAG
          default: ""
          display_strings_i18n:
            - locale: jpn
              name: Tag
              description: このデバイスコネクターのログを表示するときに使用するタグ
        - key: DC_TEXT
          default: "Hello, world!"
          display_strings_i18n:
            - locale: jpn
              name: Text
              description: テキスト
    

    上記のデバイスコネクターサービスの内容を説明します。

    image: <image name>:<tag>
    

    image で、使用するコンテナリポジトリのイメージを指定します。

    command:
        - --config
        - "/etc/dc_conf/custom/custom-text.yml"
    

    command で、実行ファイル(device-connector-intdash)の引数を指定します。 ここでは、intdash Edge Agent2にデータを送信する際に利用するパイプライン設定ファイル custom-text.yml を指定します。

    depends_on:
        intdash-edge-agent2:
            condition: service_healthy
    volumes:
        - /var/run/core/intdash:/var/run/intdash
        - /var/run/device-inventory/custom.d:/var/run/device-inventory/custom.d
    

    depends_on で、intdash Edge Agent2が起動してから、デバイスコネクターを起動するように設定します。 volumes で、intdsah Edge Agent2とFIFOで通信をするためにバインドマウントを設定します。 カスタムインベントリを送信する場合は、 /var/run/device-inventory/custom.d をバインドマウントします。

    これらの設定は、measurementプロジェクトのコンテナでは必ず追加してください。

    restart: unless-stopped
    

    デバイスコネクターがエラー終了した場合に、再起動する設定を指定します。

    environment:
        DC_FILE_SINK_CONF_PATH: ${DC_UPSTREAM_FIFO_0}
        DC_PRINT_LOG_FILTER_CONF_TAG: ${DC_TAG}
        DC_TEXT: ${DC_TEXT}
    substitution_variables:
        - key: DC_UPSTREAM_FIFO_0
          default: ""
          validation: "^/var/run/intdash/"
          display_strings_i18n:
            - locale: jpn
              name: FIFO Path
              description: intdash Edge Agent 2へデータを送信するためのFIFOのパス
        - key: DC_TAG
          default: ""
          display_strings_i18n:
            - locale: jpn
              name: Tag
              description: このデバイスコネクターのログを表示するときに使用するタグ
        - key: DC_TEXT
          default: "Hello, world!"
          display_strings_i18n:
            - locale: jpn
              name: Text
              description: テキスト
    

    environment に、パイプライン設定ファイルに記載した環境変数を記載してください。 値に substitution_variables で定義した置換変数を設定すると、コミット操作時にデバイスコネクター設定で与えた設定値で置換されます。

    以下の置換変数については、Terminal System APIが自動生成するため、デバイスコネクター設定での指定は不要です。

    • アップストリーム用のFIFOパス DC_UPSTREAM_FIFO_%d (%dには数値が入ります)

    • ダウンストリーム用のFIFOパス DC_DOWNSTREAM_FIFO_%d (%dには数値が入ります)

    • ログ表示用のタグ DC_TAG

    設定項目の詳細については、 Terminal System API ドキュメント の Device Connector Service を参照してください。

    注釈

    コンテナ内でデバイスを利用する場合は、 devices フィールドでデバイスを指定してください。

    devices:
       - /dev/ttyUSB0:/dev/ttyUSB0
    

    デバイスへのアクセスに権限が必要な場合や、デバイスの活性挿抜に対応する必要がある場合は devices フィールドは利用せず、以下のように privileged: true/dev:/dev のバインドマウントを設定してください。

    privileged: true
    volumes:
       - /dev:/dev
    
  2. 作成したファイルをエッジコンピューターの以下のパスに配置します。

    /var/lib/core/docker-compose/measurement/services/Custom\ Text.yml
    
  3. 以下のようにTerminal System APIを呼び出すか、Mender Web UIにアクセスし、デバイス画面の[Inventory]タブで、 device_connector_servicesを確認して、 Custom Text デバイスコネクターサービスが追加されたことを確認します。

    # curl -fSs http://localhost:8081/api/device_connector_services \
      | jq '.[] | select(.service_id == "Custom Text")'
    {
       "service_id": "Custom Text",
       "substitution_variables": [
          {
             "key": "DC_UPSTREAM_FIFO_0",
             "default": "",
             "validation": "^/var/run/intdash/",
             "display_strings_i18n": [
                {
                   "locale": "jpn",
                   "name": "FIFO Path",
                   "description": "intdash Edge Agent 2へデータを送信するためのFIFOのパス"
                }
             ]
          },
          {
             "key": "DC_TAG",
             "default": "",
             "display_strings_i18n": [
                {
                   "locale": "jpn",
                   "name": "Tag",
                   "description": "このデバイスコネクターのログを表示するときに使用するタグ"
                }
             ]
          },
          {
             "key": "DC_TEXT",
             "default": "Hello, world!",
             "display_strings_i18n": [
                {
                   "locale": "jpn",
                   "name": "Text",
                   "description": "テキスト"
                }
             ]
          }
       ],
       "protected": false,
       "absolute_path": "/var/lib/core/docker-compose/measurement/services/Custom Text.yml"
    }
    

Dockerイメージを使った計測

追加した Custom Text デバイスコネクターサービスで計測ができることを確認します。

  1. 事前に、エッジコンピューターで以下の設定が済んでいることを確認してください。

    • intdashサーバー接続設定

    • アップストリーム設定

  2. デバイスコネクターIPC設定で、 custom 設定を追加します。

    Mender Web UIにアクセスし、デバイス画面の[Configuration]タブで、 agent.device_connectors_upstream に以下を設定してください。

    例:

    [
       {
          "id": "device-inventory",
          "data_name_prefix": "v1/255/",
          "dest_ids": [
             "default-upstream"
          ],
          "format": "iscp-v2-compat"
       },
       {
          "id": "custom",
          "data_name_prefix": "v1/3/",
          "dest_ids": [
             "default-upstream"
          ],
          "format": "iscp-v2-compat"
       }
    ]
    
  3. デバイスコネクター設定で、デバイスコネクターサービス Custom Text を利用する設定を追加します。

    Mender Web UIにアクセスし、デバイス画面の[Configuration]タブで、 device_connectors に以下を設定してください。

    例:

    [
       {
          "id": "device-inventory",
          "upstream_ipc_ids": [
             "device-inventory"
          ],
          "downstream_ipc_ids": [],
          "service_id": "Device Inventory",
          "service_substitutions": []
       },
       {
          "id": "custom",
          "upstream_ipc_ids": [
             "custom"
          ],
          "downstream_ipc_ids": [],
          "service_id": "Custom Text",
          "service_substitutions": [
             "DC_TEXT=Custom Text"
          ]
       }
    ]
    
  4. 設定をエッジコンピューターに適用し、計測を開始します。

  5. 追加した Custom Text デバイスコネクターサービスの動作を確認します。

    Edge Finderで、デバイスコネクター設定の DC_TEXT で指定した文字列が送信されることを確認します。

    ../../../_images/edge_finder_custom_text.png

    カスタムインベントリが、intdashサーバーおよびMenderサーバーに送信されることを確認します。

    ../../../_images/viz_custom_inventory.png
    ../../../_images/mender_custom_inventory.png

    開発したDockerイメージを利用して計測をすることができました。

  6. 動作確認後、計測を停止します。

この手順ではサンプルを利用して動作確認を行いましたが、独自のエレメントのプラグインを作成することで、用途に応じたデータ送受信処理の実装が可能です。

独自エレメントの開発については、 デバイスコネクターデベロッパーガイド を、開発に役立つ情報については Tips を参考にしてください。

Docker Credential Helpers

プライベートリポジトリを利用してDockerイメージを開発する場合、 docker login コマンドを手動で実行することが非効率な場合があります。 その場合は、 Docker Credential Helpers を利用することで、 docker login を使用せずにイメージをpush、pullすることが可能です。 Dockerイメージの開発中など、Dockerイメージの更新が頻繁に発生する場合に利用することを推奨します。

Terminal System 2は、プライベートリポジトリ向けに Amazon ECR Docker Credential Helper をインストールしています。

注意

Terminal System 2でECR以外のプライベートリポジトリを利用する場合は、別途 OS開発 で Credential Helper を追加する必要があります。

Amazon ECR Docker Credential Helperを利用するためには、AWSの認証情報を設定する必要があります。 ここでは、ラッパースクリプトを利用して設定する方法を説明します。

以下のファイルを準備します。

/usr/bin/docker-credential-ecr-login-<任意の名前>

docker-credential-ecr-loginのラッパースクリプトです。 以下の環境変数を設定してdocker-credential-ecr-loginを呼び出します。プロファイルを複数利用する場合は、複数用意します。

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

~/.docker/config.json (Terminal System 2の場合は /home/root/.docker/config.json)

dockerの認証設定です。 credHelpersにECRのURLを設定します。

以下に、開発用PCおよびTerminal System 2共通の設定例を示します。 開発用PCには、あらかじめ Amazon ECR Docker Credential Helper をインストールしてください。

  1. 必要なプロファイル分だけ、 /usr/bin/docker-credential-ecr-login-<任意の名前> を作成します。 スクリプト内ではAWSアカウントの認証に必要な環境変数を設定してください。

    例:

    #!/bin/bash
    export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
    export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    docker-credential-ecr-login "$@"
    

    作成したスクリプトに実行権限を付けてください。

    # chmod +x /usr/bin/docker-credential-ecr-login-*
    
  2. dockerの認証設定 ~/.docker/config.jsoncredHelpers 設定を作成します。 ECRレジストリ <aws_account_id>.dkr.ecr.<region>.amazonaws.com に対して、対応するラッパースクリプトの名前 /usr/bin/docker-credential-ecr-login-<任意の名前> を指定します。

    例:

    • ECRレジストリ 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com に対して、 /usr/bin/docker-credential-ecr-login-sample1 を利用

    • ECRレジストリ 222222222222.dkr.ecr.us-east-1.amazonaws.com に対して、 /usr/bin/docker-credential-ecr-login-sample2 を利用

    {
        "credHelpers": {
            "111111111111.dkr.ecr.ap-northeast-1.amazonaws.com": "ecr-login-sample1",
            "222222222222.dkr.ecr.us-east-1.amazonaws.com": "ecr-login-sample2"
        }
    }
    
  3. ECRのイメージを含む docker-compose.yml を作成し、 docker login 不要でpullできることを確認します。

    version: '3'
    
    services:
        sample1:
            image: 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/sample1:latest
        sample2:
            image: 222222222222.dkr.ecr.us-east-1.amazonaws.com/sample2:latest
    
    # docker compose pull
    

次章では、デバイスにデプロイするファイルを含めたアプリケーションアップデートアーティファクトを作成し、Menderサーバーにアップロードしてリリースとして管理する方法を説明します。