

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 기본 AL2023 컨테이너 이미지 빌드
<a name="barebones-containers"></a>

AL2023 컨테이너 이미지는 AL2023 AMI에 포함된 동일한 소프트웨어 구성 요소로부터 빌드됩니다. 여기에는 기본 컨테이너 계층이 Amazon EC2 인스턴스(예: 패키지 관리자 `dnf`)에서 실행되는 것과 유사하게 작동할 수 있게 하는 소프트웨어가 포함되어 있습니다. 이 섹션에서는 애플리케이션에 대한 최소한의 종속성만 포함하는 컨테이너를 처음부터 구성하는 방법을 설명합니다.

**참고**  
표준 AL2023 컨테이너 이미지는 대부분의 사용 사례에 적합합니다. 표준 컨테이너 이미지를 사용하면 이미지 위에 쉽게 빌드할 수 있습니다. 기본 컨테이너 이미지를 사용하면 이미지 위에 빌드하기 더 어렵습니다.

**애플리케이션에 대한 종속성을 최소화한 컨테이너를 만들려면**

1. 런타임 종속 항목을 확인하세요. 이는 애플리케이션에 따라 다릅니다.

1. `FROM scratch`을 빌드하는 `Dockerfile` / `Containerfile`를 구성하세요. 다음 `Dockerfile` 예제를 사용하여 `bash` 쉘과 그 종속성만 포함하는 컨테이너를 빌드할 수 있습니다.

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build
   RUN mkdir /sysroot
   RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \
     --installroot /sysroot \
     -y \
     --setopt=install_weak_deps=False \
     install bash
   
   FROM scratch
   COPY --from=build /sysroot /
   WORKDIR /
   ENTRYPOINT ["/bin/bash"]
   ```

   1. `Dockerfile`은 다음과 같은 방법으로 실행합니다.

     1.  `build`라는 이름의 AL2023 컨테이너를 실행합니다. 이 컨테이너는 기본 컨테이너를 부트스트랩하는 데 사용되며, 자체 배포되지 않고 배포할 컨테이너를 생성합니다.

     1.  `/sysroot` 디렉터리 생성 이 디렉터리에서 `build` 컨테이너가 기본 컨테이너에 필요한 종속성을 설치합니다. 다음 단계는 `/sysroot` 경로가 기본 이미지의 루트 디렉터리가 되도록 패키징됩니다.

         이 방식으로 `--installroot` 옵션을 `dnf`로 사용하면 다른 AL2023 이미지가 만들어집니다. `dnf` 기능으로 설치 프로그램과 이미지 생성 도구를 사용할 수 있습니다.

     1.  `dnf`를 호출하여 `/sysroot`에 패키지를 설치합니다.

         이 `rpm -q system-release --qf '%{VERSION}'` 명령은 `system-release` 패키지를 쿼리(`-q`)하고 쿼리 형식(`--qf`)을 설정하여 쿼리되는 패키지 버전(`%{VERSION}` 변수는 `RPM` 버전의 `rpm` 변수)을 출력합니다. 

         `build` 컨테이너에서 `system-release` 버전의 `--releasever` 인수를 `dnf`로 설정하면 업데이트된 Amazon Linux 컨테이너 기본 이미지가 릴리스될 때마다 `Dockerfile`을 사용하여 기본 컨테이너를 다시 빌드할 수 있습니다.

         를 2023.11.20260427과 같은 `--releasever` Amazon Linux 2023 버전으로 설정할 수 있습니다. 이렇게 하면 `build` 컨테이너가 최신 AL2023 버전으로 실행되지만 현재 AL2023 릴리스와 관계없이 2023.11.20260427에서 베어본 컨테이너를 빌드합니다.

         `--setopt=install_weak_deps=False` 구성 옵션으로 권장하거나 권장되는 종속성이 아닌 *필수* 종속성만 `dnf`에 설치할 수 있습니다.

     1. 설치된 시스템을 빈 (`FROM scratch`) 컨테이너의 루트에 복사합니다.

     1. `/bin/bash` 경우 `ENTRYPOINT`를 원하는 바이너리로 설정합니다.

1. 빈 디렉터리를 만들고 2단계의 예제 내용을 `Dockerfile` 파일에 추가합니다.

   ```
   $ mkdir al2023-barebones-bash-example
   	$ cd al2023-barebones-bash-example
   	$ cat > Dockerfile <<EOF
   FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build
   RUN mkdir /sysroot
   RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \
     --installroot /sysroot \
     -y \
     --setopt=install_weak_deps=False \
     install bash && dnf --installroot /sysroot clean all
   
   FROM scratch
   COPY --from=build /sysroot /
   WORKDIR /
   ENTRYPOINT ["/bin/bash"]
   EOF
   ```

1. 다음 명령을 실행하여 컨테이너를 빌드합니다.

   ```
   $ docker build -t al2023-barebones-bash-example
   ```

1. 다음 명령으로 컨테이너를 실행하면 `bash` 전용 컨테이너가 얼마나 작은지 알 수 있습니다.

   ```
   $ docker run -it --rm al2023-barebones-bash-example
   bash-5.2# rpm
   bash: rpm: command not found
   bash-5.2# du -sh /usr/
   bash: du: command not found
   bash-5.2# ls
   bash: ls: command not found
   bash-5.2# echo /bin/*
   /bin/alias /bin/bash /bin/bashbug /bin/bashbug-64 /bin/bg /bin/catchsegv /bin/cd /bin/command /bin/fc /bin/fg /bin/gencat /bin/getconf /bin/getent /bin/getopts /bin/hash /bin/iconv /bin/jobs /bin/ld.so /bin/ldd /bin/locale /bin/localedef /bin/pldd /bin/read /bin/sh /bin/sotruss /bin/sprof /bin/type /bin/tzselect /bin/ulimit /bin/umask /bin/unalias /bin/wait /bin/zdump
   ```

좀 더 실용적인 예를 들면, 다음 방법으로 `Hello World!`를 표시하는 C 응용 프로그램 컨테이너를 빌드합니다.

1. 빈 디렉터리를 만들고 C 소스 코드 및 `Dockerfile`을 추가합니다.

   ```
   $ mkdir al2023-barebones-c-hello-world-example
   $ cd al2023-barebones-c-hello-world-example
   $ cat > hello-world.c <<EOF
   #include <stdio.h>
   int main(void)
   {
     printf("Hello World!\n");
     return 0;
   }
   EOF
   
   $ cat > Dockerfile <<EOF
   FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build
   COPY hello-world.c /
   RUN dnf -y install gcc
   RUN gcc -o hello-world hello-world.c
   RUN mkdir /sysroot
   RUN mv hello-world /sysroot/
   RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \
     --installroot /sysroot \
     -y \
     --setopt=install_weak_deps=False \
     install glibc && dnf --installroot /sysroot clean all
   
   FROM scratch
   COPY --from=build /sysroot /
   WORKDIR /
   ENTRYPOINT ["/hello-world"]
   EOF
   ```

1. 다음 명령을 실행하여 컨테이너를 빌드합니다.

   ```
   $ docker build -t al2023-barebones-c-hello-world-example .
   ```

1. 다음 명령을 실행하여 컨테이너를 실행합니다.

   ```
   $ docker run -it --rm al2023-barebones-c-hello-world-example
   Hello World!
   ```