docker 학습 시리즈 11 다단계 이미지 구축

3352 단어
텍스트 링크:https://yq.aliyun.com/articles/681819
본문
Docker 버전17.05.0-ce부터 새로운 이미지 구축 방법, 즉 다단계 구축(Multi-stage builds)을 지원했습니다. Docker 구축 응용 용기의 일부 문제점을 해결하기 위한 것입니다.일상적으로 용기를 구축하는 장면에서 같은 용기에서 원본 코드를 가져오고 컴파일하고 생성하여 최종적으로 거울로 구축하는 경우가 많다.이러한 단점은 다음과 같습니다.
  • 컨테이너에 구축 프로그램을 설치해야 하는 실행 환경
  • 같은 용기에서 프로그램의 원본과 구축에 필요한 생태 도구를 가져와야 한다
  • 구축된 렌즈는 프로그램 원본과 불필요한 파일까지 포함하여 용기 렌즈의 크기가 너무 크다
  • 물론 우리가 외부에서 프로젝트와 의존 라이브러리 컴파일 테스트를 포장한 후에 이를 구축 디렉터리에 복사하는 약간 우아한 방법도 있다. 이런 방식은 첫 번째 방식에 존재하는 위험점을 잘 피할 수 있지만 서로 다른 렌즈가 실행될 때 프로그램 실행 호환성에 따른 차이도 고려해야 한다.
    사실 이러한 문제점을 Docker도 생각해 냈다. 정부에서 간편한 다단계 구축(multi-stage build) 방안을 제공했다.이른바 다단계 구축이란 구축 과정을 여러 단계로 나눌 것이다. 같은 Dockerfile에서 서로 다른 단계를 통해 필요한 응용 파일을 구축하고 생성하며 최종적으로 이 응용 파일을release의 거울에 추가한다.이렇게 하면 위에서 만난 일련의 문제를 완전히 회피할 수 있다.다단계 구축을 실현하는데 주로 새로 제공된 키워드: fromas에 의존한다.
    다음은 밤을 들겠습니다.
    FROM muninn/glide:alpine AS build-env
    ADD . /go/src/my-proj
    WORKDIR /go/src/my-proj
    RUN go get -v
    RUN go build  -o /go/src/my-proj/my-server
    
    FROM alpine
    RUN apk add -U tzdata
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
    COPY --from=build-env /go/src/my-proj/my-server /my-server
    EXPOSE 80
    CMD ["my-server"]
    

    다단계로 구축된 Dockerfile은 두 개 이상의 Dockerfile을 합친 것처럼 보이는데 이것은 다단계라는 뜻이다.as 키워드는 구축 단계에 별명을 부여하는 데 사용되며, 다른 구축 단계에서 from 키워드를 통해 해당 키워드 단계의 구축 출력을 인용하고 사용하며 용기에 포장할 수 있다.
    다단계 구축이 끝난 후에 출력된 이미지는 최종 출력된 my-server 응용 프로그램만 포함하고 다른 원본 파일과 제3자 원본 패키지가 없어서 매우 깨끗하고 간결하다.build-env단계는 구축의 중간 과정일 뿐이기 때문이다.
    심지어 우리는 더 많은 구축 단계를 사용하여 서로 다른 응용을 구축할 수 있다. 최종적으로 이러한 구축이 생산한 응용을 최종적으로 발표해야 할 이미지에 통합시킬 수 있다.우리는 좀 더 복잡한 밤을 볼 수 있다.
    from debian as build-essential
    arg APT_MIRROR
    run apt-get update
    run apt-get install -y make gcc
    workdir /src
    
    from build-essential as foo
    copy src1 .
    run make
    
    from build-essential as bar
    copy src2 .
    run make
    
    from alpine
    copy --from=foo bin1 .
    copy --from=bar bin2 .
    cmd ...
    

    Laravel 프로젝트의 다단계 구축(자신이 추가한 내용) 1단계 추가:compose로 PHP 의존 2단계 설치:node를 설치하고 전방 의존을 설치한 후 컴파일된 파일을 생성하는 3단계:PHP 의존 및 전방build를 복사한 파일을 프로젝트 실행 디렉터리로 복사
    #
    # PHP Dependencies
    #
    FROM composer:1.7 as vendor
    
    COPY database/ database/
    
    COPY composer.json composer.json
    COPY composer.lock composer.lock
    
    RUN composer install \
        --ignore-platform-reqs \
        --no-interaction \
        --no-plugins \
        --no-scripts \
        --prefer-dist
    
    #
    # Frontend
    #
    FROM node:8.11 as frontend
    
    RUN mkdir -p /app/public
    
    COPY package.json webpack.mix.js yarn.lock /app/
    COPY resources/assets/ /app/resources/assets/
    
    WORKDIR /app
    
    RUN yarn install && yarn production
    
    #
    # Application
    #
    FROM php:7.2-apache-stretch
    
    COPY . /var/www/html
    COPY --from=vendor /app/vendor/ /var/www/html/vendor/
    COPY --from=frontend /app/public/js/ /var/www/html/public/js/
    COPY --from=frontend /app/public/css/ /var/www/html/public/css/
    COPY --from=frontend /app/mix-manifest.json /var/www/html/mix-manifest.json
    

    다단계 구축의 장점은 말하지 않아도 서로 의존하는 여러 항목을 하나의 Dockerfile을 통해 원하는 용기 이미지를 쉽게 구축할 수 있을 뿐만 아니라, 이미지가 너무 크고 원본 유출 등 위험을 걱정하지 않아도 된다는 것이다.이것은 아주 좋은 개선이라고 말할 수 밖에 없다.
    참조:
    https://docs.docker.com/develop/develop-images/multistage-build/https://yq.aliyun.com/articles/181178https://laravel-news.com/multi-stage-docker-builds-for-laravel

    좋은 웹페이지 즐겨찾기