Multi-arch 확장 빌드

Multi-arch 확장 빌드 (Build multi-arch extensions)

여러 아키텍처를 지원하는 확장을 빌드하고 푸시하는 방법을 설명하는 문서예요.

출처: 문서

본문

확장이 최소한 다음 아키텍처를 지원하도록 하는 것이 강력히 권장돼요:

  • linux/amd64
  • linux/arm64

Docker Desktop은 사용자 시스템 아키텍처에 따라 확장 이미지를 가져와요. 확장이 사용자 시스템 아키텍처와 일치하는 이미지를 제공하지 않으면 Docker Desktop은 확장을 설치할 수 없어요. 결과적으로 사용자는 Docker Desktop에서 확장을 실행할 수 없어요.

여러 아키텍처용 빌드 및 푸시 (Build and push for multiple architectures)

docker extension init 명령으로 확장을 만들었다면 디렉터리 루트의 Makefile에 push-extension이라는 이름의 타깃이 포함돼요.

make push-extension을 실행하면 linux/amd64와 linux/arm64 플랫폼 모두에 대해 확장을 빌드하고 Docker Hub에 푸시해요.

예를 들어:

$ make push-extension

또는 빈 디렉터리에서 시작했다면 아래 명령을 사용해 여러 아키텍처용 확장을 빌드하세요:

$ docker buildx build --push --platform=linux/amd64,linux/arm64 --tag=username/my-extension:0.0.1 .

그런 다음 docker buildx imagetools 명령으로 이미지 매니페스트를 확인해 이미지가 두 아키텍처 모두에서 사용 가능한지 확인할 수 있어요:

$ docker buildx imagetools inspect username/my-extension:0.0.1

Name:      docker.io/username/my-extension:0.0.1
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:f3b552e65508d9203b46db507bb121f1b644e53a22f851185d8e53d873417c48

Manifests:
  Name:      docker.io/username/my-extension:0.0.1@sha256:71d7ecf3cd12d9a99e73ef448bf63ae12751fe3a436a007cb0969f0dc4184c8c
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/amd64
  Name:      docker.io/username/my-extension:0.0.1@sha256:5ba4ceea65579fdd1181dfa103cc437d8e19d87239683cf5040e633211387ccf
  MediaType: application/vnd.docker.distribution.manifest.v2+json
  Platform:  linux/arm64

팁: 이미지 푸시에 문제가 있다면 Docker Hub에 로그인했는지 확인하세요. 그렇지 않으면 docker login을 실행해 인증하세요.

자세한 내용은 Multi-platform images 페이지를 참조하세요.

Multi-arch 바이너리 추가하기 (Adding multi-arch binaries)

확장에 호스트에 배포되는 바이너리가 포함되어 있다면, 확장을 여러 아키텍처로 빌드할 때 바이너리도 올바른 아키텍처를 가져야 하는 것이 중요해요.

현재 Docker는 metadata.json 파일에서 모든 아키텍처에 대해 여러 바이너리를 명시적으로 지정하는 방법을 제공하지 않아요. 하지만 확장의 Dockerfile에서 TARGETARCH에 따라 아키텍처별 바이너리를 추가할 수 있어요.

다음 예시는 작업의 일부로 바이너리를 사용하는 확장을 보여줘요. 이 확장은 Docker Desktop for Mac과 Windows 모두에서 실행되어야 해요.

Dockerfile에서 타깃 아키텍처에 따라 바이너리를 다운로드하세요:

#syntax=docker/dockerfile:1.3-labs
FROM alpine AS dl
WORKDIR /tmp
RUN apk add --no-cache curl tar
ARG TARGETARCH
RUN <<EOT ash
mkdir -p /out/darwin
curl -fSsLo /out/darwin/kubectl "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/darwin/${TARGETARCH}/kubectl"
chmod a+x /out/darwin/kubectl
EOT
RUN <<EOT ash
if [ "amd64" = "$TARGETARCH" ]; then
  mkdir -p /out/windows
  curl -fSsLo /out/windows/kubectl.exe "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe"
fi
EOT

FROM alpine
LABEL org.opencontainers.image.title="example-extension" \
  org.opencontainers.image.description="My Example Extension" \
  org.opencontainers.image.vendor="Docker Inc." \
  com.docker.desktop.extension.api.version=">= 0.3.3"
COPY --from=dl /out /

metadata.json 파일에서 모든 플랫폼의 모든 바이너리에 대한 경로를 지정하세요:

{
  "icon": "docker.svg",
  "ui": {
    "dashboard-tab": {
      "title": "Example Extension",
      "src": "index.html",
      "root": "ui"
    }
  },
  "host": {
    "binaries": [
      {
        "darwin": [
          {
            "path": "/darwin/kubectl"
          }
        ],
        "windows": [
          {
            "path": "/windows/kubectl.exe"
          }
        ]
      }
    ]
  }
}

결과적으로 TARGETARCH가 다음과 같을 때:

  • arm64: 가져온 kubectl 바이너리는 arm64 아키텍처에 해당하며 최종 스테이지의 /darwin/kubectl에 복사돼요.
  • amd64: 두 개의 kubectl 바이너리가 가져와져요. 하나는 Darwin용, 다른 하나는 Windows용이에요. 최종 스테이지의 /darwin/kubectl과 /windows/kubectl.exe에 각각 복사돼요.

참고: 두 경우 모두 Darwin용 바이너리 대상 경로는 darwin/kubectl이에요. 유일한 변경점은 다운로드되는 아키텍처별 바이너리예요.

확장이 설치되면 확장 프레임워크는 확장 이미지에서 Darwin용 /darwin/kubectl 또는 Windows용 /windows/kubectl.exe의 바이너리를 사용자의 호스트 파일 시스템의 특정 위치로 복사해요.

Windows 컨테이너를 실행하는 확장을 개발할 수 있나요?

Docker Extensions는 Docker Desktop for Windows, Mac, Linux에서 지원되지만, 확장 프레임워크는 Linux 컨테이너만 지원해요. 따라서 확장 이미지를 빌드할 때 OS로 linux를 타깃으로 해야 해요.

더 알아보기 (Learn more)