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, FROM
Dockerfile dosyanızda birden çok ifade kullanırsınız. Her FROM
talimat 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
.gitignore
dosyanın içeriğini tekrarlar ( projenin node_modules
sonuç dist
dizinlerinin 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_PASSPHRASE
argüman belirtin .
Bu nasıl çalışır:
1). Yalnızca ilk aşamada package.json
, yarn.lock
dosyalar 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 yarn
komut, 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 dist
adı 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_modules
adlı 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_modules
ilk ara resimdeki dizinimiz var, artık SSH_KEY
ve SSH_KEY_PASSPHRASE
argümanlar yok. Derleme için gereken geri kalanlar proje dizinimizden kopyalanır.
3). Üçüncü aşamada, ezze/geoport:0.6.0
yalnızca dist
ikinci ara görüntüdeki dizini ekleyerek production
ve 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_KEY
ve SSH_KEY_PASSPHRASE
son görüntüde.