Genişleyen Peter Grainger cevabı kullandığım başardı çok aşamalı yapı Docker 17.05 beri mevcut. Resmi sayfa devletleri:
Çok aşamalı derlemelerle, FROMDockerfile dosyanızda birden çok ifade kullanırsınız. Her FROMtalimat farklı bir taban kullanabilir ve her biri yapının yeni bir aşamasını başlatır. Son görüntüde istemediğiniz her şeyi geride bırakarak yapay nesneleri bir aşamadan diğerine seçici olarak kopyalayabilirsiniz.
Bunu akılda tutmak, Dockerfileüç yapım aşaması ekleme örneğidir . İstemci web uygulamasının üretim görüntüsünü oluşturmak içindir.
# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
chmod 0700 /root/.ssh && \
ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
yarn --pure-lockfile --mutex file --network-concurrency 1 && \
rm -rf /root/.ssh/
# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod
# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]
.dockerignore.gitignoredosyanın içeriğini tekrarlar ( projenin node_modulessonuç distdizinlerinin kopyalanmasını engeller ve engeller ):
.idea
dist
node_modules
*.log
Bir görüntü oluşturmak için komut örneği:
$ docker build -t ezze/geoport:0.6.0 \
--build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
--build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
./
Özel SSH anahtarınızın bir parolası yoksa, yalnızca boş SSH_KEY_PASSPHRASEargüman belirtin .
Bu nasıl çalışır:
1). Yalnızca ilk aşamada package.json, yarn.lockdosyalar ve özel SSH anahtarı adlı ilk ara görüntüye kopyalanır sources. Daha fazla SSH anahtarı parolası isteminden kaçınmak için otomatik olarak eklenir ssh-agent. Son olarak yarnkomut, NPM'den gerekli tüm bağımlılıkları yükler ve Bitbucket'ten SSH üzerinden özel git depolarını klonlar.
2). İkinci aşama, web uygulamasının kaynak kodunu oluşturur ve küçültür ve distadı verilen bir sonraki ara görüntünün dizinine yerleştirir production. Yüklü kaynak kodunun, bu satır tarafından ilk aşamada üretilen node_modulesadlı resimden kopyalandığını unutmayın sources:
COPY --from=sources /app/ /app/
Muhtemelen şu satır da olabilir:
COPY --from=sources /app/node_modules/ /app/node_modules/
Burada sadece node_modulesilk ara resimdeki dizinimiz var, artık SSH_KEYve SSH_KEY_PASSPHRASEargümanlar yok. Derleme için gereken geri kalanlar proje dizinimizden kopyalanır.
3). Üçüncü aşamada, ezze/geoport:0.6.0yalnızca distikinci ara görüntüdeki dizini ekleyerek productionve bir web sunucusu başlatmak için Node Express'i yükleyerek etiketlenecek son görüntünün boyutunu küçültüriz .
Resimleri listelemek şöyle bir çıktı verir:
REPOSITORY TAG IMAGE ID CREATED SIZE
ezze/geoport 0.6.0 8e8809c4e996 3 hours ago 717MB
<none> <none> 1f6518644324 3 hours ago 1.1GB
<none> <none> fa00f1182917 4 hours ago 1.63GB
node carbon b87c2ad8344d 4 weeks ago 676MB
burada etiketlenmemiş görüntüler birinci ve ikinci ara yapım aşamalarına karşılık gelir.
Eğer koşarsan
$ docker history ezze/geoport:0.6.0 --no-trunc
Eğer herhangi bir şekilde bahsedilen görmez SSH_KEYve SSH_KEY_PASSPHRASEson görüntüde.