🕌

ローカルAMDマシンからARM向けDockerイメージをECRにpushする

に公開

Docker Hubからイメージをpullして、ECRのプライベートリポジトリにpushしたい。
ECSはARMで起動するが、ローカルマシンがAMDの時にどうするか。

例としてDify-appを挙げる。
langgenius/dify-api:1.2.0
https://hub.docker.com/layers/langgenius/dify-api/1.2.0/images/sha256-61ccc755edc0c4739ce36e992848199b40314a67b90e855c9883d4e95895fa48

アーキテクチャがAMDかARMかによってdocker imageが異なる。
Docker Hubに記載されている以下のコマンドを実行すると、Dockerのプラットフォーム自動判別機能によって、コマンドを実行したマシンのCPUアーキテクチャに合ったイメージが自動的に選択されてpullされる。

$docker pull langgenius/dify-api:1.2.0

pullしたimageのアーキテクチャを含む情報を知りたい場合は、inspectコマンドで表示することで確認できる。

$docker image inspect イメージ名:タグ
$docker image inspect langgenius/dify-api:1.2.0
[
    {
        "Id": "sha256:ab528bacf29f96326aeb2b916f858de5b06d3fab2298af1fcbc0181254652f10",
        "RepoTags": [
            "langgenius/dify-api:1.2.0"
        ],
        "RepoDigests": [
            "langgenius/dify-api@sha256:ab528bacf29f96326aeb2b916f858de5b06d3fab2298af1fcbc0181254652f10"
        ],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2025-04-09T09:17:20.23465337Z",
        "DockerVersion": "27.5.1",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5001/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/app/api/.venv/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=C.UTF-8",
                "GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
                "PYTHON_VERSION=3.12.10",
                "PYTHON_SHA256=07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea",
                "POETRY_VERSION=2.0.1",
                "POETRY_CACHE_DIR=/tmp/poetry_cache",
                "POETRY_NO_INTERACTION=1",
                "POETRY_VIRTUALENVS_IN_PROJECT=true",
                "POETRY_VIRTUALENVS_CREATE=true",
                "POETRY_REQUESTS_TIMEOUT=15",
                "FLASK_APP=app.py",
                "EDITION=SELF_HOSTED",
                "DEPLOY_ENV=PRODUCTION",
                "CONSOLE_API_URL=http://127.0.0.1:5001",
                "CONSOLE_WEB_URL=http://127.0.0.1:3000",
                "SERVICE_API_URL=http://127.0.0.1:5001",
                "APP_WEB_URL=http://127.0.0.1:3000",
                "TZ=UTC",
                "VIRTUAL_ENV=/app/api/.venv",
                "TIKTOKEN_CACHE_DIR=/app/api/.tiktoken_cache",
                "COMMIT_SHA=2c2efe2e1e46751206dfa5972790cef6ad31a93f"
            ],
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "/app/api",
            "Entrypoint": [
                "/bin/bash",
                "/entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "org.opencontainers.image.created": "2025-04-09T09:15:00.065Z",
                "org.opencontainers.image.description": "Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.",
                "org.opencontainers.image.licenses": "NOASSERTION",
                "org.opencontainers.image.revision": "2c2efe2e1e46751206dfa5972790cef6ad31a93f",
                "org.opencontainers.image.source": "https://github.com/langgenius/dify",
                "org.opencontainers.image.title": "dify",
                "org.opencontainers.image.url": "https://github.com/langgenius/dify",
                "org.opencontainers.image.version": "1.2.0"
            }
        },
        "Architecture": "arm64",
        "Os": "linux",
        "Size": 4572,
        "GraphDriver": {
            "Data": null,
            "Name": "overlayfs"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:c9b18059ed426422229b2c624582e54e7e32862378c9556b90a99c116ae10a04",
                "sha256:72bbb1662472ad6910e83fcbd167e4e25a5ae7485cedc06ae347a6e77985dc30",
                "sha256:da7f2e8f7fbce1f3f87d7794022b81f909c6aaa65702fcdcdc5f68adc4b8c35d",
                "sha256:d5eb11643076d70b73887d3c3f294309f90ae2091124088e6cd3a75b0f51633a",
                "sha256:d1f0ba488790652beedb3fd53c69576a1e8ad7661364389e4ccf91ec307e783b",
                "sha256:75d7f1d23e62eee83192f7219b6f23a3cc1720168b340778f9a2c7c9ec86ed38",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:2c7ddf1121f7da76632920e44e3947094b49f1b73dbcdaa026746d693dd0c548",
                "sha256:48d62e0816794d40f432c903e71ba571c45c4bf63f7a3c49aa50327575f2f3b5",
                "sha256:0499e40671d977cdf273e8471f880b0e16b4bc8fd5a0c0f4eeb1f3bfc7139d45",
                "sha256:2b2a760337a97a60a298a9e27801fc5df3ec432b3170e852f81313560d035f18",
                "sha256:4c86a8d9b4f80d32906457ea7ca314d7c4255a9eacaf1a215e1251b0845ba95f",
                "sha256:686290e39e1b88d5cd91d01ae0c66290c36b159341fdceb2614e5ec464993a5a",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
            ]
        },
        "Metadata": {
            "LastTagTime": "2025-05-22T13:43:03.125624377Z"
        }
    }
]

もしアーキテクチャのみが知りたい場合は、次のようにフォーマットを指定できる。

$docker image inspect イメージ名:タグ --format '{{.Os}}/{{.Architecture}}'
$docker image inspect langgenius/dify-api:1.2.0 --format '{{.Os}}/{{.Architecture}}'
linux/amd64

プラットフォーム(アーキテクチャ)を指定してimageをpullしたい場合は、"platform="で指定が可能。

$docker pull --platform=linux/arm64 langgenius/dify-api:1.2.0

イメージを削除するときはdocker imagesでイメージIDを確認して、docker rmiで削除する。

$docker images
REPOSITORY                   TAG                IMAGE ID       CREATED         SIZE
langgenius/dify-api          1.2.0              ab528bacf29f   6 weeks ago     3.12GB
$docker rmi ab528bacf29f

AMDマシンからARM向けDockerイメージをECRにpushする実際の手順

<アカウントID>は、自分がimageをpushしたいAWSのアカウントID。

Docker Hubからimageをpullする

$docker pull --platform=linux/arm64 langgenius/dify-api:1.2.0

ecrにログインする。

$aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com

imageにタグを付ける

$docker tag langgenius/dify-api:1.2.0 <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:タグ
例:
$docker tag langgenius/dify-api:1.2.0 <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/dify-api-dev:1.2.0

imageをpushする

$docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:タグ
例:
$docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/dify-web-dev:1.2.0

トラブルシューティング

手順の通り実行する際に、エラーが発生したら次の確認をする。

  • AWS CLIの実行が可能なこと
  • .aws/credentialsが正しく設定されていること
  • 必要なIAMポリシーを持っていること。以下に最低限必要なポリシーを記載する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:DescribeImages"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:*:repository/*"
        }
    ]
}

by 株式会社DELTA
https://teamdelta.jp/


[CTO Booster]
https://costcut.cloud/

[VersionUp booster]
https://teamdelta.jp/lp/versionup


Discussion