docker 학습 시리즈 11 다단계 이미지 구축
본문
Docker 버전
17.05.0-ce
부터 새로운 이미지 구축 방법, 즉 다단계 구축(Multi-stage builds)을 지원했습니다. Docker 구축 응용 용기의 일부 문제점을 해결하기 위한 것입니다.일상적으로 용기를 구축하는 장면에서 같은 용기에서 원본 코드를 가져오고 컴파일하고 생성하여 최종적으로 거울로 구축하는 경우가 많다.이러한 단점은 다음과 같습니다.사실 이러한 문제점을 Docker도 생각해 냈다. 정부에서 간편한 다단계 구축(multi-stage build) 방안을 제공했다.이른바 다단계 구축이란 구축 과정을 여러 단계로 나눌 것이다. 같은 Dockerfile에서 서로 다른 단계를 통해 필요한 응용 파일을 구축하고 생성하며 최종적으로 이 응용 파일을release의 거울에 추가한다.이렇게 하면 위에서 만난 일련의 문제를 완전히 회피할 수 있다.다단계 구축을 실현하는데 주로 새로 제공된 키워드:
from
와 as
에 의존한다.다음은 밤을 들겠습니다.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.