Использование make для управления docker-контейнерами

Mar 27, 2017 13:55 · 644 words · 4 minute read make docker docker-compose

Make — утилита предназначенная для автоматизации преобразования файлов из одной формы в другую, говорит нам Википедия. Ключевое слово здесь — автоматизация.

Как видно из заголовка, речь пойдет об использовании утилиты Make не по назначению — давайте разберемся, как ускорить и упростить работу с docker-контейнерами в консоли Linux!

Утилита Make входит в состав пакета build-essential и в Debian-based дистрибутивах устанавливается командой:

sudo apt-get install build-essential

Теперь, если в командной строке ввести make, то утилита попытается найти файл с именем Makefile (по умолчанию) в текущем каталоге и выполнить инструкции из него. Если в текущем каталоге есть несколько файлов с инструкциями, то можно указать нужный с помощью параметра -f:

make -f MyMakefile

В самом простом Makefile должны быть такие составляющие:

цель: 
[tab] команда

Примечание. Строка с командой обязательно должна начинаться с табуляции.

Makefile чуть посложнее может включать в себя зависимости, например:

цель: цель1 цель2

цель1: 
[tab] команда

цель2: 
[tab] команда

В Makefile также можно использовать комментарии и переменные:

# Это комментарий
VAR=123

цель: цель1 цель2

цель1: 
[tab] команда

цель2: 
[tab] echo $(VAR)

По умолчанию Make станет выполнять самую первую инструкцию из списка, если цель выполнения не была явно указана при вызове:

make <цель>

Однако с помощью параметра .DEFAULT_GOAL в Makefile можно задать цель, которая будет выполняться по умолчанию (мы этим обязательно воспользуемся).

В нашем случае утилита Make используется для упрощения работы с docker-образами и контейнерами, а Makefile выглядит так:

.DEFAULT_GOAL := help
# Локальный docker-registry для образов
REGISTRY = registry.git.labs.lc:5000/e.lebed/test
# Выводит описание целей - все, что написано после двойного диеза (##) через пробел
help:
  @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-16s\033[0m %s\n", $$1, $$2}'
 
##################################################
# Создание (build) сжатых (squashed) docker-образов и пуш (push) в docker-registry для использования других окружениях
# Для сжатия (squash) на хост машине должен быть установлен флаг "experimental"
# Для пуша нужно залогиниться в docker-registry
##################################################
dc-bsp-all : dc-bsp-redis dc-bsp-workspace dc-bsp-php-fpm dc-bsp-node-npm dc-bsp-memcached dc-bsp-nginx dc-push-images
 
dc-bsp-nginx: ## Создание сжатого docker-образа для контейнера nginx
  docker build -f nginx/Dockerfile --squash -t $(REGISTRY):nginx-ed-sq nginx
 
dc-bsp-memcached: ## Создание сжатого docker-образа для контейнера memcached
  docker build -f memcached/Dockerfile --squash -t $(REGISTRY):memcached-ed-sq memcached
 
dc-bsp-node-npm: ## Создание сжатого docker-образа для контейнера node-npm
  docker build -f node-npm/Dockerfile --squash -t $(REGISTRY):node-npm-ed-sq node-npm
 
dc-bsp-php-fpm: ## Создание сжатого docker-образа для контейнера php-fpm
  docker build -f php-fpm/Dockerfile --squash -t $(REGISTRY):php-fpm-ed-sq php-fpm
 
dc-bsp-redis: ## Создание сжатого docker-образа для контейнера redis
  docker build -f redis/Dockerfile --squash -t $(REGISTRY):redis-ed-sq redis
 
dc-bsp-workspace: ## Создание сжатого docker-образа для контейнера workspace
  docker build -f workspace/Dockerfile --squash -t $(REGISTRY):workspace-ed-sq workspace
 
dc-push-images: ## Пуш созданных docker-образов в docker-registry
  docker push $(REGISTRY)
 
####################################################################################################
# Управление контейнерами с помощью docker-compose (dc)
####################################################################################################
dc-build: ## Сборка docker-образов согласно инструкциям из docker-compose.yml
  docker-compose build
 
dc-up: ## Создание и запуск docker-контейнеров, описанных в docker-compose.yml
  docker-compose up -d
 
dc-down: ## Остановка и УДАЛЕНИЕ docker-контейнеров, описанных в docker-compose.yml
  docker-compose down
 
dc-stop: ## Остановка docker-контейнеров, описанных в docker-compose.yml
  docker-compose stop
 
dc-start: ## Запуск docker-контейнеров, описанных в docker-compose.yml
  docker-compose start
 
####################################################################################################
# Подключение к консоли контейнеров (контейнеры должны быть запущены)
####################################################################################################
console-workspace: ## Подключение к консоли контейнера workspace (пользователь www-data)
  docker-compose exec --user www-data workspace bash
 
console-nginx: ## Подключение к консоли контейнера nginx (пользователь root)
  docker-compose exec nginx bash
 
console-php-fpm: ## Подключение к консоли контейнера php-fmp (пользователь root)
  docker-compose exec php-fpm bash
 
console-node: ## Подключение к консоли контейнера node (пользователь www-data)
  docker-compose run --user www-data --rm node bash

С таким Makefile для того чтобы собрать docker-образ для контейнера с Nginx, достаточно выполнить в консоли:

make dc-bsp-nginx

Еще один хороший пример Makefile, который в связке с докером и сборочными контейнерами используется для сборки релизов (взято тут):

IMAGE = leanlabs/client
TAG   = 1.1.9
 
build:
  @docker run --rm -v $(CURDIR):/data -v $$HOME/node_cache:/cache leanlabs/npm-builder npm install
  @docker run --rm -v $(CURDIR):/data -v $$HOME/node_cache:/cache leanlabs/npm-builder bower install --allow-root
  @docker run --rm -v $(CURDIR):/data -v $$HOME/node_cache:/cache leanlabs/npm-builder grunt build
 
release:
  @docker build -t $(IMAGE) .
  @docker tag $(IMAGE):latest $(IMAGE):$(TAG)
  @docker push $(IMAGE):latest
  @docker push $(IMAGE):$(TAG)
 
.PHONY: build release
tweet Share