Docker를 사용하여 Azure Sphere 이미지 빌드하기

Rena Kim
WIZnet
Published in
8 min readSep 16, 2020

Created 16 SEP 2020 | Modified 16 SEP 2020

Azure Sphere의 2020–07 업데이트에서 컨테이너를 사용하여 이미지를 빌드하는 내용이 소개되었다. 자세한 내용은 아래 Azure sphere 가이드 문서에서 확인할 수 있다.

컨테이너를 사용하면 내 로컬 PC에 개발 환경을 설치하지 않아도 일종의 가상 환경에서 필수 리소스만으로 설정한 동작을 수행할 수 있다.

물론 개발 진행 시에는 잦은 코드 수정과 디버깅이 필요하므로 개발환경을 설정하는 게 좋겠지만 application을 배포할 때는 꽤 유용할 것 같다는 생각이 들었다.

Docker 설치

가이드 문서를 참조하여 Docker 설치를 진행한다.

(참고) VSCode Docker 확장

Visual Studio Code의 Docker 확장을 사용하면 Docker 탭에서 생성된 Container와 Image 목록, 그리고 각 컴포넌트의 상세 설정들을 확인할 수 있다.

디버깅이 필요할 때나 이미지, 컨테이너 등의 상세 정보를 필요로 할때 유용하게 사용된다.

컨테이너를 통한 빌드를 진행하면서 상태를 monitoring 해 볼 것이다.

Azure Sphere Sample 빌드

공식 문서에서는 azure sphere sample 어플리케이션을 사용하여 컨테이너를 통해 빌드하는 과정을 안내하고 있다.

이미 생성된 개발 환경 컨테이너를 제공하고 있는데 특징은 다음과 같다.

  • Ubuntu Linux 기반
  • 최신 버전의 Azure Sphere SDK 사용

먼저 가이드 문서의 과정을 따라 샘플 어플리케이션을 빌드해 본다.

Dockerfile 작성

FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repoRUN git clone https://github.com/Azure/azure-sphere-samples.gitFROM azsphere-samples-repo AS azsphere-sampleapp-buildRUN mkdir /build
WORKDIR /build
ENV sample=HelloWorld/HelloWorld_HighLevelAppCMD 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
에디터로 작성하면 보기 좋게 표시해 준다. (위 이미지는 VS code)

Dockerfile로부터 이미지 빌드

Parameter

  • —-tag: 이미지 이름 지정. 옵션을 사용하지 않으면 12자리의 랜덤 값으로 생성된다.
  • — -target: 사용할 다단계 빌드 지정
  • 기본적으로 이름이 Dockerfile인 파일을 사용하며, 직접 파일을 지정하려면 —-file 옵션을 사용한다.

docker build --target azsphere-sampleapp-build --tag azsphere-sampleapp-build .

Docker run

--name 옵션을 사용하여 컨테이너의 이름을 지정하고, 실행(run)한다.

docker run --name hello_hl azsphere-sampleapp-build

build log

빌드 결과물을 로컬 환경으로 복사

컨테이너 내에 생성된 빌드 결과물을 로컬 환경으로 복사한다.

docker cp hello_hl:/build .

그림과 같이 컨테이너 내 개발환경을 사용해 빌드된 결과물을 확인할 수 있다.

ASG200 App 빌드

Azure Sphere sample App으로 동작을 확인했으니, ASG200_App repository를 사용하여 빌드해 본다.

최신 버전의 Azure sphere SDK에 대응되도록 별도의 브랜치를 생성했다. (2020.08 기준, 20.07 SDK)

Dockerfile 수정 작성

소스 코드 repository를 지정하고, 폴더 구조를 고려하여 sample 경로를 설정한다.

파일명은 Dockerfile.asg200으로 설정했다.

FROM mcr.microsoft.com/azurespheresdk AS azsphere-samples-repoRUN git clone https://github.com/WIZnet-Azure-Sphere/ASG200_App -b sdk-20.07FROM azsphere-samples-repo AS asg200-app-buildRUN mkdir /build
WORKDIR /build
ENV sample=WIZASG200_HLApp_AzureIoTCMD cmake -G "Ninja" \
-DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
-DAZURE_SPHERE_TARGET_API_SET="latest-lts" \
-DCMAKE_BUILD_TYPE="Debug" \
/ASG200_App/Software/${sample} && \
ninja

Build and Run

file명을 지정해 주었다.

docker build --target asg200-app-build --tag asg200-app-build --file Dockerfile.asg200 .

Run

docker run asg200-app-build

빌드 시 --name 파라미터를 지정하지 않으면 어떻게 나오는지 확인해 봤다.

Docker 확장 메뉴에서 컨테이너를 검사(inspect)하면, 다음과 같이 설정된 값을 확인할 수 있다. (설정을 조회하면 json파일이 열린다.)

Hostname 값을 확인하면 된다.

Name과 Id는 docker 명령어로도 확인할 수 있다.

docker ps --all

확인한 Hostname을 파라미터로 주어 빌드 결과물을 로컬로 복사한다.

docker cp 417af05f2f58:/build .

빌드된 Azure sphere 어플리케이션을 확인할 수 있다. (.imagepackage)

어플리케이션은 로컬에서 Sideload를 통해 배포하거나 AS3(Azure Sphere Security System)을 통해 OTA로 배포할 수 있다.

컨테이너를 사용하여 Azure Sphere 어플리케이션을 간단히 빌드해 보았다.

이 다음으로는 컨테이너 빌드 환경과 Github Actions를 사용하여 빌드 및 배포 프로세스를 만들어 볼 계획이다.

Reference

--

--