🕌
ローカルAMDマシンからARM向けDockerイメージをECRにpushする
Docker Hubからイメージをpullして、ECRのプライベートリポジトリにpushしたい。
ECSはARMで起動するが、ローカルマシンがAMDの時にどうするか。
例としてDify-appを挙げる。
langgenius/dify-api:1.2.0
アーキテクチャが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
[CTO Booster]
[VersionUp booster]
Discussion