結論
ShellScriptを用意しなくてもdocker exec
で十分。
Dockerfile
でUSER
とWORKDIR
指定すれば、docker exec container phpunit
でテスト可能。
前置き
以前、ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話なんて記事を書きました。
当時は、多分この方法が一番楽と思ってたんですけど、Docker1.3になってから、execというコマンドが追加されました。
これめちゃくちゃ便利ですね。便利な上に楽。なので、これ使って書き直してみます。
さっそくはまった
実はこれ書きながら試行錯誤してるんですけど、SSH接続してコマンド投げる部分をexec
に置き換えりゃいいと思ってたんですね。
無理でしたけど。cd
さえ許してくれませんでした;
そもそも、nsinit
とかnsenter
なんてものを後から知ったもので、何が出来るのか全然把握してないんですよね。
いろいろ検証
docker exec container env
してみると、どうも$HOME
さえ設定されてない模様。そもそもユーザーがroot?
なので、ちょっと確かめてみました。
FROM ubuntu:14.04
RUN adduser --disabled-password --gecos "Webapp" webapp
RUN mkdir /home/webapp/app
USER webapp
WORKDIR /home/webapp/app
$ docker build -t agen/exectest .
$ docker run -i -t agen/exectest --name exectest /bin/bash
$ docker exec exectest whoami
webapp
$ docker exec exectest pwd
/home/webapp/app
ちうわけで、Dockerfile
にUSER
として明記してやれば、それでちゃんと思った通りのユーザー切替ができます。
# $HOME
はありませんでした。。。
# まあ必要かって言われると必要じゃないので、別にいいんですけど。
ところで、じゃあSupervisorとか使ってるとどうなるかというと、ルート権限がないって怒られるわけです。
じゃあどうすればいいかっていうと、CMD ["sudo", "supervisord"]
とかしてやればいいです。
sudoer
に追加してあげないと、たぶんパスワード入力しろって怒られるような気もしてます。
以上を踏まえて
新生・コンテナの中のPHPUnitを叩く君は以下のようになります。
#!/bin/bash
CONTAINER_NAME=exectest
docker exec $CONTAINER_NAME $@
・・・これ別にShellScriptにしなくていいですよね? というわけで結論。
追記
こんなことのためにDockerfile弄るのも悔しいというか、何とかできないと思ってたところ、よくよく考えると↓でいいんじゃないかと思い始めた。
#!/bin/bash
CONTAINER_NAME=exectest
docker exec $CONTAINER_NAME su -l webapp -c "cd /home/webapp/app; $*"
盲点。。。