Docker 이미지 단순화
개요
나는 응용 프로그램의 용기에 대응할 때 이런 경험이 비교적 많다고 생각한다.
Docker 이미지 크기가 커지면 Docker Hub, Amazon ECR 등의 기본 저장소에서
push/pull은 시간이 오래 걸리고 서비스 반영은 시간이 오래 걸리거나 기다리기 때문에 스트레스를 받을 수 있습니다.
따라서 사이즈를 최대한 줄이고 경량화하며 안전 위험을 줄이기 위한 방법이다.
경량화해야 한다
예를 들어 공식 버전과 알파인에 비해 1/10 정도의 사이즈가 다르다.
node 시
- node:8 -> 670MB
- node:8-alpine -> 65MB
루비의 경우
- ruby:2.4 -> 684MB
- ruby:2.4-alpine -> 61.7MB
Rails의 Dockerfile 예
그러면 Dockerfile을 한 걸음 한 걸음 살펴보겠습니다.
우선 Ruby on Rails의 경우 Gem install을 통해 패키지 등을 설치해야 합니다.
그리고 apk를 사용하여 필요한 패키지를 설치합니다.
이번 상황에서 yarn을 사용했다고 가정하고 node가 설치된 루비-2.6를 지정합니다.필요하면gem 설치에 필요한 패키지를 추가하십시오.예를 들어 mysql-dev 등이다.
1단계
FROM ruby:2.5.0-alpine as Builder
RUN apk add --update --no-cache \
build-base \
openssl \
git
다음은 bundle install입니다.-j4는 4개를 동시에 다운로드하고 설치할 수 있기 때문에 시간을 조금 줄이고 싶은 상황에서 편리하다.또한 종료 후 필요하지 않은cache, 컴파일용 파일 삭제
RUN gem install --no-document bundler
RUN bundle install -j4 --retry 3 \
&& rm -rf /usr/local/bundle/cache/*.gem \
&& find /usr/local/bundle/gems/ -name "*.c" -delete \
&& find /usr/local/bundle/gems/ -name "*.o" -delete
이후 yarn install 등을 실시하여 첫 번째 단계로 끝낸다.rails assets::precompile 등은 시간이 필요하기 때문에 Dockerfile에서 지정하지 말고 다른 작업으로 미리 실행하는 것을 권장합니다.
# Install yarn packages
COPY package.json yarn.lock /app/
RUN yarn install
# Add the Rails app
ADD . /app
마지막 단계
From에서 실제 응용 프로그램을 실행하는 데 필요한 버전을 지정합니다.
또 이곳의 특징은 최소한의 소프트웨어 패키지만 설치하는 것이다.
여분의 포장을 넣으면 사이즈가 커지고 안전 위험도 높아진다.
# -----ファイナルステージ -----
FROM ruby:2.4.1-alpine
RUN apk add --update --no-cache \
tzdata && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
테스터라는 사용자를 임시로 만듭니다.모바일 응용 프로그램은 루트 권한이 필요하지 않기 때문이다.
# Add user
RUN addgroup -g 1000 -S tester \
&& adduser -u 1000 -S tester -G tester
1단계에 설치된 Gem 라이브러리와 Rails 소스 코드를 복사합니다.권한도 chown으로 다시 쓰는 것을 잊지 마세요.
COPY --from=Builder /usr/local/bundle/ /usr/local/bundle/
COPY --from=Builder --chown=tester:tester /app /app
마지막으로 Rails(puma 서버)를 시작하여 종료합니다.USER tester
WORKDIR /app
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
어플리케이션에 필요하지 않은 것이 없으므로 Rails console 등이 움직이지 않는다는 점에 유의해야 합니다.경품
Golang이면 더 쉬워요.
# --- ビルドステージ ---
FROM golang:alpine AS Builder
RUN apk update && apk add ca-certificates git
WORKDIF /app
ADD . /app
# mod を使った場合のパッケージダウンロード
COPY ./go.mod ./go.sum ./
RUN go mod download
RUN cd /app && go build -o goapp
# --- ファイナルステージ ---
FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=Builder /app/goapp /app
ENTRYPOINT ./goapp
결론
이전 1G 정도의 이미지 크기는 400MB 정도로 바뀌었고 ECR에서의pull/push는 이전보다 일찍 편안해졌다.Golang의 경우 20MB 정도라서 더 편해요.간단하고 가볍고 빠르다... 컨테이너에 더 적합하다.
멀티스테이지builders를 배울 때 이곳의 유튜브는 사람들에게 인상을 남기기 쉬우니 참고할 만하다.
https://www.youtube.com/watch?v=wGz_cbtCiEA
그럼, 좋은 컨테이너 생활을 하세요.
Reference
이 문제에 관하여(Docker 이미지 단순화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ytanaka3/items/8c308db2ee58ea63626a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)