바이너리 내보내기
바이너리 내보내기 (Export binaries)
Docker를 사용해 애플리케이션을 독립 실행형(standalone) 바이너리로 빌드할 수 있다는 사실, 알고 계셨나요? 때로는 애플리케이션을 Docker 이미지로 패키징·배포하고 싶지 않을 때가 있어요. 그럴 때 Docker로 애플리케이션을 빌드하고, 익스포터(exporter)를 사용해 출력물을 디스크에 저장하면 돼요.
출처: 문서
본문
Docker의 --output 플래그는 빌드의 출력 형식을 바꿀 수 있게 해 줘요. --output type=local,dest=... 같은 형태로 쓰죠.
빌드에서 바이너리 내보내기 (Export binaries from a build)
local 익스포터를 사용하면 빌드 결과를 호스트 파일시스템에 저장할 수 있어요. 여기서 멋진 점은 Docker가 가진 강력한 격리(isolation)와 빌드 기능을 사용해 독립 실행형 바이너리를 만들 수 있다는 거예요. 이는 Go, Rust처럼 단일 바이너리로 컴파일되는 언어에서 특히 잘 동작해요.
다음 예시는 "Hello, World!"를 출력하는 간단한 Rust 프로그램을 만들고, 그 바이너리를 호스트 파일시스템으로 내보내요.
이 예시를 위한 새 디렉터리를 만들고 이동해요:
$ mkdir hello-world-bin
$ cd hello-world-bin
다음 내용으로 Dockerfile을 만들어요:
# syntax=docker/dockerfile:1
FROM rust:alpine AS build
WORKDIR /src
COPY <<EOT hello.rs
fn main() {
println!("Hello World!");
}
EOT
RUN rustc -o /bin/hello hello.rs
FROM scratch
COPY --from=build /bin/hello /
ENTRYPOINT ["/hello"]
여기서 COPY <<EOT ... EOT 문법은 here-document예요. Dockerfile에서 여러 줄 문자열을 작성할 수 있게 해 줘요. 여기서는 간단한 Rust 프로그램을 Dockerfile 안에 인라인으로 만드는 데 사용했어요.
FROM scratch 이미지는바이너리만 담긴 최소 최종 이미지를 만들기 위한 것이에요. 이렇게 빌드하면 rust:alpine 빌드 스테이지에서는 Rust 도구로 컴파일하고, 최종 결과물에는 정적 바이너리만 남게 되죠.
빌드 후 --output type=local,dest=...로 바이너리를 호스트로 내보내면 되고, 실행만 목적이라면 그대로 실행할 수도 있어요.