Thank you for reading this post, don't forget to subscribe!
Начнем с простой программы на Go:
1 2 3 |
<span id="3a22" class="hd he dv ba hf b dz hg hh r hi" data-selectable-paragraph=""><strong class="hf hj">package</strong> main</span><span id="e391" class="hd he dv ba hf b dz hk hl hm hn ho hh r hi" data-selectable-paragraph=""><strong class="hf hj">import</strong> "fmt"</span><span id="c429" class="hd he dv ba hf b dz hk hl hm hn ho hh r hi" data-selectable-paragraph=""><strong class="hf hj">func</strong> main() { fmt.Println("Hello world!") }</span> |
Соберем ее с помощью образа golang:alpine одноступенчатым способом (single-stage build). Вот Dockerfile:
1 2 3 4 5 |
<span id="2554" class="hd he dv ba hf b dz hg hh r hi" data-selectable-paragraph=""><strong class="hf hj">FROM</strong> golang:alpine <strong class="hf hj">WORKDIR</strong> /app <strong class="hf hj">ADD</strong> . /app <strong class="hf hj">RUN</strong> cd /app && go build -o goapp <strong class="hf hj">ENTRYPOINT</strong> ./goapp</span> |
Теперь соберем образ и запустим контейнер:
1 2 |
<span id="0e70" class="hd he dv ba hf b dz hg hh r hi" data-selectable-paragraph="">docker build -t treeder/hello . docker run --rm treeder/hello</span> |
Все работает, но давайте посмотрим на размер с помощью docker images | grep treeder/hello
.
258 МБ — многовато для крошечного бинарного файла. Теперь давайте попробуем многоступенчатуюсборку (multi-stage build) с использованием нового Dockerfile:
1 2 3 4 5 6 7 8 |
<span id="468f" class="hd he dv ba hf b dz hg hh r hi" data-selectable-paragraph=""><em class="hx"># стадия сборки</em> <strong class="hf hj">FROM</strong> golang:alpine AS build-<strong class="hf hj">env</strong> <strong class="hf hj">ADD</strong> . /src <strong class="hf hj">RUN</strong> cd /src && go build -o goapp</span><span id="662e" class="hd he dv ba hf b dz hk hl hm hn ho hh r hi" data-selectable-paragraph=""><em class="hx"># финальная стадия</em> <strong class="hf hj">FROM</strong> alpine <strong class="hf hj">WORKDIR</strong> /app <strong class="hf hj">COPY</strong> --from=build-env /src/goapp /app/ <strong class="hf hj">ENTRYPOINT</strong> ./goapp</span> |
Соберем и запустим снова:
1 2 |
<span id="0a24" class="hd he dv ba hf b dz hg hh r hi" data-selectable-paragraph="">docker build -t treeder/hello . docker run --rm treeder/hello</span> |
Проверим размер:
6,35 МБ — намного лучше.