호스트 바이너리 호출하기

호스트 바이너리 호출하기 (Invoke host binaries)

확장에 포함되어 호스트에 배포되는 실행 파일(바이너리, 셸 스크립트)을 호출하는 방법을 설명하는 문서예요.

출처: 문서

본문

어떤 경우에는 확장이 호스트에서 명령을 호출해야 할 수도 있어요. 예를 들어, 새 리소스를 만들기 위해 클라우드 공급자의 CLI를 호출하거나, 확장이 제공하는 도구의 CLI를 호출하거나, 호스트에서 실행하려는 셸 스크립트를 호출하고 싶을 수 있어요.

확장 SDK로 컨테이너에서 CLI를 실행해 그렇게 할 수도 있어요. 하지만 이 CLI는 호스트 파일 시스템에 접근해야 하는데, 컨테이너에서 실행되면 이는 쉽지도 빠르지도 않아요.

이 페이지는 확장의 일부로 배송되어 호스트에 배포되는 실행 파일(바이너리, 셸 스크립트)을 호스트에서 실행하는 방법을 설명해요. 확장은 여러 플랫폼에서 실행될 수 있으므로, 지원하려는 모든 플랫폼에 대한 실행 파일을 배송해야 한다는 뜻이에요.

확장 아키텍처에 대해 자세히 알아보세요.

참고: 확장은 사용자 접근 권한으로 실행된다는 점에 유의하세요. 이 API는 확장 메타데이터의 host 섹션에 나열된 바이너리로 제한되지 않아요(일부 확장은 사용자 상호작용 중에 소프트웨어를 설치하고, 확장 메타데이터에 나열되지 않은 새로 설치된 바이너리를 호출할 수 있음).

이 예시에서 CLI는 파라미터와 함께 호출되어 문자열을 반환해야 하는 간단한 Hello world 스크립트예요.

확장에 실행 파일 추가하기 (Add the executables to the extension)

Mac 및 Linux용 bash 스크립트를 binaries/unix/hello.sh 파일에 만드세요:

#!/bin/sh
echo "Hello, $1!"

Windows용 배치 스크립트를 다른 파일 binaries/windows/hello.cmd에 만드세요:

@echo off
echo "Hello, %1!"

그런 다음 Dockerfile을 업데이트해 binaries 폴더를 확장의 컨테이너 파일 시스템으로 복사하고 파일을 실행 가능하게 만드세요.

# Copy the binaries into the right folder
COPY --chmod=0755 binaries/windows/hello.cmd /windows/hello.cmd
COPY --chmod=0755 binaries/unix/hello.sh /linux/hello.sh
COPY --chmod=0755 binaries/unix/hello.sh /darwin/hello.sh

UI에서 실행 파일 호출하기 (Invoke the executable from the UI)

확장에서 Docker Desktop Client 객체를 사용해 ddClient.extension.host.cli.exec() 함수로 확장이 제공하는 셸 스크립트를 호출하세요.

이 예시에서 바이너리는 확장 뷰가 렌더링되는 즉시 result?.stdout으로 얻은 문자열 결과를 반환해요.

export function App() {
  const ddClient = createDockerDesktopClient();
  const [hello, setHello] = useState("");

  useEffect(() => {
    const run = async () => {
      let binary = "hello.sh";
      if (ddClient.host.platform === 'win32') {
        binary = "hello.cmd";
      }
      const result = await ddClient.extension.host?.cli.exec(binary, ["world"]);
      setHello(result?.stdout);
    };
    run();
  }, [ddClient]);

  return (
    <div>
      {hello}
    </div>
  );
}

중요: 아직 Vue용 예시는 없어요. 양식을 작성해 Vue 샘플을 원한다고 알려주세요. 중요: 아직 Angular용 예시는 없어요. 양식을 작성해 Angular 샘플을 원한다고 알려주세요. 중요: 아직 Svelte용 예시는 없어요. 양식을 작성해 Svelte 샘플을 원한다고 알려주세요.

메타데이터 파일 구성하기 (Configure the metadata file)

호스트 바이너리는 metadata.json 파일에 지정해야 확장 설치 시 Docker Desktop이 호스트에 복사해요. 확장이 제거되면 복사된 바이너리도 함께 제거돼요.

{
  "vm": {
    ...
  },
  "ui": {
    ...
  },
  "host": {
    "binaries": [
      {
        "darwin": [
          {
            "path": "/darwin/hello.sh"
          }
        ],
        "linux": [
          {
            "path": "/linux/hello.sh"
          }
        ],
        "windows": [
          {
            "path": "/windows/hello.cmd"
          }
        ]
      }
    ]
  }
}

path는 컨테이너 안의 바이너리 경로를 나타내야 해요.

더 알아보기 (Learn more)