컨테이너를 사용하여 Azure Sphere 앱 빌드
참고
이 항목에서는 Windows용 Docker Desktop을 사용하여 컨테이너에 Azure Sphere 애플리케이션을 빌드하는 방법을 설명합니다. Linux의 Docker 컨테이너에서 앱을 빌드하려면 Microsoft 아티팩트 레지스트리 또는 MAR(Microsoft Container Registry 또는 MCR이라고도 함)에서 동일한 azurespheresdk 컨테이너를 사용할 수 있습니다.
Docker Desktop 설치
Docker를 사용하여 Azure Sphere SDK가 미리 설치된 독립 실행형 Linux 컨테이너를 실행할 수 있습니다. 이 이미지는 사용자 고유의 배포를 위한 기반으로 사용할 수도 있습니다. 이미지 태그는 포함된 SDK의 버전을 나타냅니다.
Docker 컨테이너를 다운로드하고 실행하려면 먼저 Windows 또는 Linux에 Docker Desktop을 설치해야 합니다.
Windows용 Docker Desktop을 설치한 후 Hyper-V 및 컨테이너 Windows 기능을 사용하도록 설정해야 합니다. 설치 후 다시 부팅해야 할 수 있습니다.
설치되면 Windows 시작 메뉴 또는 바탕 화면에 추가된 바로 가기 아이콘에서 Docker Desktop을 시작합니다.
Linux는 Windows의 Docker Desktop에 대한 기본 컨테이너 유형입니다. Azure Sphere는 Linux 컨테이너를 사용합니다. Linux 컨테이너를 실행하려면 Docker가 올바른 디먼을 대상으로 하는지 확인해야 합니다. Linux가 현재 기본 컨테이너 형식인지 확인하려면 시스템 트레이에서 Docker 고래 아이콘을 마우스 오른쪽 단추로 클릭합니다. Windows 컨테이너로 전환이 표시되면 이미 Linux 디먼을 대상으로 하고 있습니다. Windows 컨테이너에 있는 경우 시스템 트레이에서 Docker 고래 아이콘을 마우스 오른쪽 단추로 클릭할 때 작업 메뉴에서 Linux 컨테이너로 전환을 선택하여 이를 전환할 수 있습니다. 자세한 내용은 Windows와 Linux 컨테이너 간 전환을 참조하세요.
참고
Docker 데스크톱 고래 아이콘 애니메이션이 중지될 때까지 기다립니다. 아이콘이 숨겨진 알림 영역에 있을 수 있습니다. 아이콘을 마우스로 가리키면 Docker Desktop 상태 표시됩니다.
Azure Sphere SDK 빌드 환경 컨테이너를 사용하여 샘플 앱 빌드
컨테이너를 입력하고 명령을 실행하여 대화형으로 컨테이너를 사용할 수 있습니다. 그러나 Docker가 원래 Azure Sphere 이미지를 기반으로 사용자 지정 이미지를 빌드하는 데 사용할 수 있는 파일에서 애플리케이션을 빌드하는 데 필요한 단계를 캡처하는 것이 더 효율적입니다. 이렇게 하면 빌드 프로세스가 반복 가능하고 일관됩니다. 기본적으로 이 파일의 이름은 Dockerfile이어야 하며 docker 명령이 실행되는 $PATH 있어야 합니다.
다음 단계에서는 Azure Sphere 샘플을 빌드하기 위한 Dockerfile 지침을 만들기 위한 개요를 제공합니다. 사용자 고유의 요구에 맞게 이러한 단계를 조정할 수 있습니다.
mcr.microsoft.com/azurespheresdk 컨테이너를 기반으로 새 컨테이너를 만듭니다.
GitHub에서 Azure Sphere 샘플 리포지토리를 복제합니다.
샘플을 빌드할 때 저장할 디렉터리를 만듭니다.
빌드하려는 샘플을 지정하는 환경 변수를 만듭니다.
CMake를 실행하여 샘플을 빌드하고 지정된 디렉터리에 배치합니다.
샘플을 빌드하기 위한 Dockerfile 만들기
Azure Sphere 이미지를 기반으로 하지만 사용자 지정 빌드 기능을 사용하여 Docker 이미지를 빌드하려면 다음 Docker 지침에 따라 텍스트 파일(파일 확장명 없음)을 만듭니다.
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
RUN git clone https://github.com/Azure/azure-sphere-samples.git
FROM azsphere-samples-repo AS azsphere-sampleapp-build
RUN mkdir /build
WORKDIR /build
ENV sample=HelloWorld/HelloWorld_HighLevelApp
CMD cmake -G "Ninja" \
-DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
-DAZURE_SPHERE_TARGET_API_SET="latest-lts" \
-DCMAKE_BUILD_TYPE="Debug" \
/azure-sphere-samples/Samples/${sample} && \
ninja
이 파일은 ENV 환경 변수를 사용하여 빌드할 샘플을 지정합니다. EnV에 대한 새 값을 설정하여 HelloWorld/HelloWorld_HighLevelApp 다른 샘플을 빌드합니다.
Dockerfile 지침에 대한 자세한 내용은 Dockerfile 지침에 대한 줄별 설명을 참조하세요.
Dockerfile을 사용하여 기본 샘플 앱 빌드
사용자 지정 Dockerfile을 사용하여 샘플 앱을 빌드하는 데 필요한 세 가지 단계가 있습니다.
PowerShell, Windows 명령 프롬프트 또는 Linux 명령 셸과 같은 명령줄 인터페이스를 사용하여 Dockerfile에서 이미지를 빌드합니다.
docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .
옵션은
--target
사용할 다단계 빌드의 일부를 지정합니다. 옵션은--tag
이미지의 이름을 지정하며 소문자여야 합니다. Docker 이미지는 항상 소문자만 사용해야 합니다. 를 사용하여 이름을--tag
지정하지 않으면 이미지에 사용하기 쉽지 않은 12자리 숫자가 있습니다. 명령의 끝에 있는 기간을 잊지 마세요. 명령을 사용하여 이미지를 나열할docker images
수 있습니다.Docker는 "Dockerfile"이라는 파일을 기반으로 azsphere-sampleapp-build 라는 이미지를 빌드합니다. Dockerfile의 이름이 다른 경우 옵션을 사용하여
--file
이름을 지정합니다.옵션을 사용하여 컨테이너에 더 간단한 이름을 지정합니다
--name
. 명령은run
컨테이너를 입력하고 ENV 환경 변수에 지정된 샘플을 빌드합니다. 명령줄 인터페이스를 사용하여 다음 명령을 입력합니다.docker run --name hello_hl azsphere-sampleapp-build
샘플 앱(HelloWorld/HelloWorld_HighLevelApp)이 빌드되고 컨테이너 내의
/build
디렉터리에 배치됩니다. 컨테이너 실행이 완료되면 컨테이너가 종료되고 명령줄 인터페이스로 돌아갑니다.참고
이 명령은 상호 작용 없이 앱을 빌드하고 빌드가 완료된 후 컨테이너를 종료합니다. 종료 후에도 컨테이너가 계속 활성화되어 있습니다. 또는
--rm
옵션을 지정-it
하지 않았기 때문입니다. 나중에 Docker Desktop이docker run
실행되는 한 다시 빌드하지 않고 컨테이너에서 명령을 다시 사용할 수 있습니다.컨테이너 내부에서 호스트 컴퓨터 환경으로 빌드 결과를 복사합니다. 명령줄 인터페이스를 사용하여 다음 명령을 입력합니다.
docker cp hello_hl:/build .
이 명령은 hello_h1 컨테이너 내의
/build
디렉터리의 내용을 명령을 실행한 호스트 컴퓨터의 디렉터리에 복사합니다./build
디렉터리가 샘플을 컴파일할 작업 디렉터리(WORKDIR)로 지정됩니다. 컨테이너 외부에 있지만 docker cp 명령을 사용하여 명령을 실행합니다. 명령의 끝에 있는 기간을 잊지 마세요.
사용자 지정 Dockerfile을 사용하여 다른 샘플 빌드
다른 샘플(예: GPIO 샘플)을 빌드하려면 GPIO 샘플에 대한 경로를 제공합니다.
docker run --name gpio_hl --env sample=GPIO/GPIO_HighLevelApp azsphere-sampleapp-build
빌드가 완료되면 컨테이너 내부에서 호스트 컴퓨터 환경으로 결과를 복사합니다.
docker cp gpio_hl:/build .
명령의 끝에 있는 기간을 잊지 마세요.
패키지를 호스트 컴퓨터 환경에 복사한 후 Windows 또는 Linux의 Azure CLI 명령을 사용하여 애플리케이션을 배포할 수 있습니다. 자세한 내용은 애플리케이션 배포를 참조하세요.
컨테이너에서 USB를 통한 디바이스 상호 작용은 지원되지 않습니다.
Dockerfile 지침에 대한 줄별 설명
샘플을 작성하기 위해 Dockerfile 만들기에서 만든 Dockerfile의 각 부분은 아래에 설명되어 있습니다.
여러 빌드 준비
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
이 줄은 원래 microsoft.com/azurespheresdk 컨테이너를 기반으로 새 빌드 azsphere-samples-repo를 설정합니다.
Azure Sphere 샘플 다운로드
RUN git clone https://github.com/Azure/azure-sphere-samples.git
이 줄은 Azure Sphere 샘플 리포지토리의 모든 샘플을 복제합니다.
다른 대상 지정 가능한 다단계 빌드 추가
FROM azsphere-samples-repo AS azsphere-sampleapp-build
이 줄은 azsphere-samples-repo 빌드를 기반으로 하는 새 빌드를 추가합니다.
컨테이너 내에서 작업 디렉터리 설정
RUN mkdir /build
WORKDIR /build
이러한 줄은 새 작업 디렉터리를 만듭니다.
샘플을 지정하는 기본 환경 변수 만들기
ENV sample=HelloWorld/HelloWorld_HighLevelApp
이 줄은 빌드할 샘플을 지정하는 환경 변수를 만듭니다. 이 경우 HelloWorld_HighLevelApp 샘플입니다. 환경 변수를 재정의하여 샘플 이름과 경로를 지정할 수 있습니다.
CMake 및 Ninja를 실행하여 패키지 빌드
CMD cmake -G "Ninja" \
-DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
-DAZURE_SPHERE_TARGET_API_SET="latest-lts" \
-DCMAKE_BUILD_TYPE="Debug" \
/azure-sphere-samples/Samples/${sample} && \
ninja
이 섹션에서는 CMake를 사용하여 Ninja를 호출하여 패키지를 빌드할 때 사용되는 매개 변수를 지정합니다.
빌드가 완료되면 컨테이너 실행이 중지됩니다.
Docker 팁
이러한 팁은 Docker를 보다 효과적으로 작업하는 데 도움이 될 수 있습니다.
docker run 명령을 사용하여 기본 컨테이너를 대화형으로 탐색
명령줄 인터페이스를 사용하여 다음 명령을 입력합니다.
docker run --rm -it mcr.microsoft.com/azurespheresdk
이 예제 mcr.microsoft.com/azurespheresdk
에서 은 컨테이너가 만들어진 이미지의 이름입니다.
--rm
옵션은 실행 후 컨테이너를 종료하고 옵션은 컨테이너에 -it
대한 대화형 액세스를 지정합니다.
Azure Sphere SDK 빌드 환경 Docker 컨테이너는 mar(Microsoft 아티팩트 레지스트리)에서 제공되며 공용에서 사용할 수 있습니다.
컨테이너가 이미 로컬 컴퓨터에 있는 경우 다시 다운로드되지 않습니다.
다운로드 및 설정에는 몇 분 정도 걸릴 수 있습니다. 빌드 환경에는 Azure Sphere Linux SDK를 사용하여 패키지를 빌드하는 데 필요한 모든 것이 포함됩니다.
명령이 run
완료되면 명령 프롬프트가 "#" 기호로 변경됩니다. 이제 Linux 기반 Docker 컨테이너 내에 있습니다.
ls를 입력하면 이 목록과 유사하게 컨테이너 내의 현재 Linux 디렉터리가 표시됩니다.
bin cmake-3.14.5-Linux-x86_64 etc lib makeazsphere.sh mnt opt root sbin sys usr
boot dev home lib64 media ninja proc run srv tmp var
를 입력 exit
하여 컨테이너를 그대로 둡니다. 컨테이너는 더 이상 사용할 수 없으며 다음 명령을 사용하여 컨테이너를 다시 만들어야 합니다.
docker run --rm -it mcr.microsoft.com/azurespheresdk
옵션을 사용하지 --rm
않으면 종료할 때 컨테이너가 삭제되지 않습니다.
컨테이너 식별
새 컨테이너를 빌드하면 ID와 같은 a250ade97090
ID가 있습니다(ID가 다를 수 있습니다). 많은 Docker 명령의 경우 microsoft.com/azurespheresdk 주소 대신 ID를 사용해야 합니다.
다음은 이 명령을 사용하여 시스템의 컨테이너에 대한 기본 정보의 일반적인 목록입니다.
docker ps --all
결과는 다음과 유사합니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a250ade97090 microsoft.com/azurespheresdk "/bin/bash" 15 minutes ago Up 9 seconds pedantic_kilby
ID가 다릅니다. Docker는 컨테이너 소유자의 임의 이름을 구성합니다. 이 예제에는 컨테이너가 하나만 있습니다.
컨테이너 내에서 작업
실행 명령을 사용하지 않고 컴퓨터의 컨테이너 내에서 작업하려면 다음을 입력하여 실행하려는 컨테이너의 컨테이너 ID 및 스크립트와 함께 exec 명령을 사용합니다.
docker exec -t a250ade97090 /bin/bash
명령 프롬프트가 "#" 기호로 변경됩니다. 이제 Linux 기반 Docker 컨테이너에 있습니다. ls를 입력하면 컨테이너 내에 현재 Linux 디렉터리가 표시됩니다.
bin cmake-3.14.5-Linux-x86_64 etc lib makeazsphere.sh mnt opt root sbin sys usr
boot dev home lib64 media ninja proc run srv tmp var
컨테이너를 나가려면 명령을 입력합니다 exit
.
Azure Sphere SDK 빌드 컨테이너 제한 사항
Azure Sphere SDK 빌드 컨테이너는 Azure Sphere 패키지만 빌드하도록 설계되었습니다. Azure CLI 명령을 실행하거나, 디바이스를 복구 또는 테스트용으로 로드하거나, 디버깅하도록 설계 되지 않았습니다 . 컨테이너는 USB 함수에 액세스할 수 없습니다.
Docker Linux 컨테이너 제한 사항
Docker Linux 컨테이너는 Linux의 전체 설치와 동일하지 않습니다. 예를 들어 Docker Linux 컨테이너에서는 Linux GUI 애플리케이션을 실행할 수 없습니다.
다단계 빌드 컨테이너를 사용하여 종속성 줄이기
Docker 다단계 빌드 기능을 사용하면 Dockerfile에서 여러 FROM 문을 사용하여 종속성을 줄일 수 있습니다. 각 FROM 명령은 다른 베이스를 사용할 수 있으며 각 명령은 빌드의 새 단계를 시작합니다.
Docker 다단계 빌드에 대한 자세한 내용은 다단계 빌드 사용을 참조하세요.
다단계 빌드는 모범 사례로 Docker에서 권장합니다. Docker 모범 사례에 대한 자세한 내용은 Dockerfile 모범 사례 소개 가이드를 참조하세요.
AS 인수를 사용하여 스테이지에 의미 있는 이름 추가
기본적으로 스테이지의 이름은 지정되지 않지만 ID 번호가 있습니다. AS 및 이름을 추가하여 의미 있는 이름을 스테이지에 추가하여 Dockerfile을 더 읽기 쉽게 만들 수 있습니다. 예를 들어:
FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repo
다단계 명령에서 AS 인수를 사용하는 방법에 대한 자세한 내용은 빌드 스테이지 이름을 참조하세요.
모범 사례로 의미 있는 이름으로 대상 빌드
대상을 빌드할 때 --tag 옵션을 사용하여 의미 있는 이름을 지정할 수 있습니다. 의미 있는 이름은 유용합니다. 예를 들어:
docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .
Docker 빌드 명령과 함께 이름을 사용하는 방법에 대한 자세한 내용은 Docker 빌드 참조를 참조하세요.