티스토리 뷰

Dockerfile을 작성할 때, 이미지를 빠르게 생성해보고 싶어 정작 Docker 홈페이지를 꼼꼼하게 보지 않았었다.

 

홈페이지에서 제공하는 내용은 간단한게 참고만 하고 넘어갔었다.

 

아래 페이지에서 Get started 정도만 확인하고 구글링을 하면서 Dockerfile을 작성했다.

 

그런데 잘 찾아보면, Docker 홈페이지에서는 Dockerfile을 "잘" 만드는 방법을 가이드해주고 있었다.

 

Dockerfile 작성 모범 사례(Best practices for writing Dockerfiles) 페이지인데,

 

이 페이지에서 가이드해 주는 몇 가지만 짚어보고 넘어가려고 한다.

 

이 내용이 나오기 전에는 일반적인 Docker를 빌드하는데 유의해야 하는 내용들이 나온다.

 

예를 들어, 임시 컨테이너를 사용해라, 명령어를 잘 활용해서 레이어 수를 적게 가져가라, 캐시를 이용해라 등을 알려주는데,  대부분의 내용들은 build를 수행할 때 자동으로 처리된다.

 

쭉 읽다보면 instructions이 나온다. 번역을 지침이라고 해석해야할 지, 명령어들이라고 해석해야할 지 애매한데(명령어 들이 맞는 듯?),

 

여기서부터 조금 재밌는 이야기가 나와서 정리해봤다.

 

1. 가능하면 alpine을 사용

Docker는 엄격하게 제어되고 크기가 작으면서(현재 6MB 미만) 전체 Linux 배포판인 Alpine 이미지를 권장한다.

 

난 Ubuntu를 썼는데, 익숙하다는 것 외엔 사실 큰 이유가 있진 않았다. 그리고 설치해보니 거의 1GB가 넘는 이미지가 생성됐었다.

 

앞으로는 Alpine을 주로 사용해야하지 싶다.

 

2. apt-get update 와 install을 한줄 사용

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y curl

이유는 굉장히 명확한데, 만약 위와같이 update와 install을 따로 작성하고 curl을 설치한다. 그 다음 오랜 시간이 지난 후, Dockerfile을 수정한다.

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y curl nginx

nginx가 추가 되기전의 명령어들은 Docker 캐시에 남아있어 다시 수행되지 않는다.

 

apt가 업데이트 되지 않기 때문에 nginx를 설치할 때 최신 버전을 다운로드 하지 않게 된다.

 

따라서 아래와 같이 한줄로 작성하는 것을 권장 한다.

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo  \
    && rm -rf /var/lib/apt/lists/*

 

3. ADD보단 COPY

 

ADD와 COPY는 거의 비슷한 동작을 하는 명령어이다. 하지만 COPY가 좀더 명확하기 때문에 COPY의 사용을 권장한다.

 

COPY는 로컬 파일을 컨테이너로 복사하는 기본 기능만 지원하는 반면, ADD는 더 다양한 기능을 제공하기 때문이다.

 

COPY는 개별적으로 사용하는 것을 권장하는데, 필요한 파일이 변경될 경우 반드시 다시 실행되어야 하기 때문이다.

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

위와 같이 작성하는 걸 권장한다.

 

4. ADD를 이용한 URL 호출 보다는 curl or wget

ADD를 이용해 remote URL로 패키지를 다운로드하는 것도 권장되지 않으니 wget이나 curl로 install하는 것이 좋다고 한다.

ADD https://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

위 보단 아래를 권장한다.

RUN mkdir -p /usr/src/things \
    && curl -SL https://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

 

5. RUN cd .. 대신 WORKDIR

아래와 같은 명령어가 많아지면 유지관리가 어렵기 때문에 WORKDIR 명령어를 쓰는 것을 권장한다.

RUN cd … && do-something

 

마치며

사실 더 많은 권장사항들이 있지만, 개인적으로 눈에 띄는 것 위주로 정리했다. 그리고 권장사항 이기 때문에 반드시 따를 필요는 없다.

 

면접에서 Docker 홈페이지에 왜 apt-get update 와 install을 한줄 사용하는가? 에 대한 글이 있는데, 이것에 대해 아는게 있는지? 라는 질문을 받았는데 제대로 대답하지 못 했다.

 

내가 작성했던 apt-get update && install 을 확인보니까 다 두줄로 작성했었다.

 

그런데 내가 작성한 Dockerfile은 이후에 추가로 패키지를 다운로드 하지 않았었으니 별 문제는 없었을 것 같지만, 대답 못한게 마음에 걸려 좀 더 자세히 알아보았다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함