busybox 컨테이너에서 실행 가능한 C++, Go 프로그램 빌드
BusyBox 이미지를,
# test.dockerfile
FROM busybox:1.28
ENV TZ=Asia/Seoul
RUN DEBIAN_FRONTEND=noninteractive
만들어 놓고,
docker build -t test_app:1.0 -f test.dockerfile .
컨테이너를 생성한 다음,
docker run -v /c/temp:/app --name test_app-instance -w /app --rm -it test_app:1.0 /bin/sh
c:\temp 디렉터리에 gcc로 빌드한 C++ 프로그램을,
#include <cstdio>
int main()
{
printf("hello from %s!\n", "cpptest");
return 0;
}
실행했더니, "not found"라고만 나옵니다.
/app # ./cpptest.out
/bin/sh: ./cpptest.out: not found
반면 Ubuntu WSL 환경에서는 (동일한 파일의) cpptest.out 실행이 잘 됩니다. 이와 유사하게 Go 언어도 마찬가지로 기본 빌드로는 "not found" 오류가 나옵니다.
이에 대해 검색해 보면,
How to build a docker build file that can run my c++ program in busybox?
; https://stackoverflow.com/questions/55930279/how-to-build-a-docker-build-file-that-can-run-my-c-program-in-busybox
역시나 이번에도 glibc 링킹 문제입니다. 실제로 busybox에 있는 /bin 디렉터리의 모든 실행 파일들은 "not a dynamic executable" 유형에 속하는 정적 링킹 바이너리입니다.
따라서, busybox를 대상으로 실행하려면
C/C++의 경우 -static 링킹을 해야 하고,
GoLang의 경우에는 CGO_ENABLED=0 설정을,
C#의 경우에는 StaticExecutable 설정을 해야 합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]