Docker Makefileのライブラリ化
以前Makefile
の記事を書きましたが、便利は便利なのですがつかっていると困ったことが出てきます。
いくつか環境構築していくとMakefile
をコピーしていきます。そして環境単位でMakefile
を改善すると機能があったりなかったりと最新もどれだかという事態に。
そういうわけでMake
の機能でinclude
文を利用してもうほとんど書き換えない共通部分を切り出します。
共通のdocker.mk
make
にもインクルードパスがあるようで、 /usr/local/include/
パスのファイルを探してくれるようです。
root
権限があるならばここにパスを指定せずにインクルードできるので置くならここが良いでしょう。
権限がない場合は、ホームディレクトリに場所を決め、インクルード時にパスを指定してあげるようにするといいですね。
all_container=`docker ps -a -q`
active_container=`docker ps -q`
images=`docker images | awk '/^<none>/ { print $$3 }'`
attach_cmd?=/bin/bash --login
all:
build:
docker build -t $(NAME):$(VERSION) .
restart: stop start
start:
docker run -d \
--name $(NAME) \
-h $(NAME) \
$(DOCKER_RUN_OPTIONS) $(NAME):$(VERSION)
stop:
docker rm -f $(NAME)
logs:
docker logs $(NAME)
attach:
docker exec -it $(NAME) $(attach_cmd)
tag:
docker tag $(NAME):$(VERSION) $(NAME):latest
clean: clean_container clean_images
clean_images:
@if [ "$(images)" != "" ] ; then \
docker rmi $(images); \
fi
clean_container:
@for a in $(all_container) ; do \
for b in $(active_container) ; do \
if [ "$${a}" = "$${b}" ] ; then \
continue 2; \
fi; \
done; \
docker rm $${a}; \
done
前回からの改善点
docker run
時にbash
を指定するのをやめました。Dockerfile
のCMD
で指定するようにしました。
clean
の変更、現在動いていないコンテナを削除するようにしました。(ここは今後も改善していく)
呼び出し方
以下Makefile
からの呼び出し例です。
NAME
:コンテナ、イメージ名に使用されます。
VERSION
:イメージのTAGに使用されます。
DOCKER_RUN_OPTIONS
:docker run
のオプションに追加されます。
ファイルを/usr/local/include
に置いた場合は以下のようにファイル名だけでOKです。
個人の場所に置いたならinclude $(HOME)/.docker/docker.mk
のように書きます。
NAME=gitlab
VERSION=7.9-20151030
DOCKER_RUN_OPTIONS=\
--add-host=gitlab:172.17.240.1 \
--privileged
include docker.mk
使用方法
ファイルDockerfile
とMakefile
を同じパスに置きます。
イメージ構築
$ make build
コンテナ起動
$ make start
コンテナ停止
$ make stop
コンテナ再起動
$ make restart
コンテナ内操作
$ make attach
不要イメージ、コンテナ削除
$ make clean