Докеризация 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