September 5, 2017

Dockerで、ちょっとしたphpのコードを試す

Dockerで、ちょっとしたphpのコードを試すためのMakefileを書いた。

REPL

PHP_IMAGE := php:5.6.31-alpine
DOCKER_OPT := run -it --rm -v$(shell pwd):/tmp

ifeq ($(firstword $(MAKECMDGOALS)), run)
	PHP_SCRIPT := $(wordlist 2, 2, $(MAKECMDGOALS))
endif

all:
	@echo Usage:
	@echo make run hoge.php
	@echo make repl
	@echo make shell

.PHONY: run repl shell
run:
	@docker ${DOCKER_OPT} ${PHP_IMAGE} php /tmp/${PHP_SCRIPT}

repl:
	@docker ${DOCKER_OPT} ${PHP_IMAGE} php -a

shell:
	@docker ${DOCKER_OPT} ${PHP_IMAGE} sh

.SILENT:
%:
	@:

例えばmake run hoge.phpなどと打つと、hoge.phpもターゲットと見なされる。これをrunの引数として使うには、ひと工夫必要だ。それが、冒頭のifeq文。firstwordwordlistは、makeコマンドが提供している関数。ターゲットリスト(MAKECMDGOALS)の先頭がrunなら、2番目をPHP_SCRIPTに入れる。

.PHONYは、たとえカレントディレクトリにrunreplといったファイルがあったとしても、dockerコマンドを実行させるための細工。

$(shell pwd)により、カレントディレクトリを得て、コンテナの/tmpにマップする。

dockerの前の@は、コマンドのエコーバック抑止。

先の例で言えば、hoge.phpも依然としてターゲットなので、ワイルドカードの%:で捕まえて、何もしない@:に食わせる。.SILENTは、makeコマンドのverboseを明示的に抑止する。

余談だが、Windows(やMacも?)では、php -aが、REPLとはほど遠い使用感だ。<?phpから書き始め、Ctrl+Z<CR>を打つまで(MacならCtrl+Dかも)実行してくれなかったり…。

Apache

ちゃんとApacheでサーブするなら…。

PHP_IMAGE := php:7.1.9-apache
CONT_NAME := mycontainer
DOCKER_OPT := -it --rm -v$(shell pwd)/src:/var/www/html --name ${CONT_NAME}

all:
	@echo Usage:
	@echo make run
	@echo make shell
	@echo make tap
	@echo make stop

.PHONY: run shell tap stop
run:
	@docker run ${DOCKER_OPT} -d -p8888:80 ${PHP_IMAGE}

shell:
	@docker run ${DOCKER_OPT} ${PHP_IMAGE} bash

tap:
	@docker exec -it ${CONT_NAME} bash

stop:
	@docker stop ${CONT_NAME}

.SILENT:
%:
	@:

ローカルのsrcディレクトリがドキュメントルートになる。make runしてから、http://localhost:8888/へアクセス。実行中のコンテナを覗くにはmake tap

使用例はここ

Tags: php docker