Top.Mail.Ru

Докеризация golang-приложения

Введение

В этой статье я покажу пример сборки контейнера с golang-приложением в 2 этапа - компиляция в промежуточном контейнере и сборка контейнера с приложением. Промежуточный контейнер нужен для того, чтобы не тянуть на продакшен все зависимости, необходимые для компиляции golang-приложения.

Я написал небольшой "каркас" для воркеров на go, с получением заданий из rabbitmq - github.com/n1te/worker, в качестве приложения для контейнеризации можно использовать пример /example/example.go. Приложение также использует файл конфигурации config.toml, который необходимо будет добавить в контейнер с приложением.

Этап 1: компиляция приложения в промежуточном контейнере.

Создаём файл с описанием промежуточного контейнера, называем его, к примеру, Dockerfile.build:

FROM golang:1.7
RUN mkdir -p /go/src/example
WORKDIR /go/src/example
ADD . /go/src/example
RUN go get .
RUN go build
CMD tar -czf - example config.toml

Исходный код добавляется в контейнер, подтягиваются зависимости с помощью go get, и, наконец, компилируется приложение.

Итак, собираем и запускаем промежуточный контейнер:

docker build -t example-build -f Dockerfile.build .
docker run example-build > build.tar.gz

На выходе получаем архив build.tar.gz с приложением и файлом конфигурации.

Этап 2: создание контейнера с приложением.

Теперь всё просто - надо упаковать приложение в новый контейнер без лишних зависимостей. Создаём файл с описанием основного контейнера с названием по умолчанию - Dockerfile.

FROM debian:latest
RUN mkdir -p /service
WORKDIR /service
ADD ./build.tar.gz /service/
CMD ./example

Команда ADD автоматически распаковывает архив в указанную директорию.

Собираем контейнер:

sudo docker build -t example/example .

Теперь можно удалить архив и запустить контейнер с приложением:

rm build.tar.gz
docker run -d -i -t \
    --name example \
    example/example