Использование make для управления docker-контейнерами
Mar 27, 2017 13:55 · 644 words · 4 minute read
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