LoginSignup
5
5

More than 5 years have passed since last update.

続・ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話

Last updated at Posted at 2014-11-10

結論

ShellScriptを用意しなくてもdocker execで十分。
DockerfileUSERWORKDIR指定すれば、docker exec container phpunitでテスト可能。

前置き

以前、ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話なんて記事を書きました。
当時は、多分この方法が一番楽と思ってたんですけど、Docker1.3になってから、execというコマンドが追加されました。
これめちゃくちゃ便利ですね。便利な上に楽。なので、これ使って書き直してみます。

さっそくはまった

実はこれ書きながら試行錯誤してるんですけど、SSH接続してコマンド投げる部分をexecに置き換えりゃいいと思ってたんですね。
無理でしたけど。cdさえ許してくれませんでした;
そもそも、nsinitとかnsenterなんてものを後から知ったもので、何が出来るのか全然把握してないんですよね。

いろいろ検証

docker exec container envしてみると、どうも$HOMEさえ設定されてない模様。そもそもユーザーがroot?
なので、ちょっと確かめてみました。

Dockerfile
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

ちうわけで、DockerfileUSERとして明記してやれば、それでちゃんと思った通りのユーザー切替ができます。
# $HOMEはありませんでした。。。
# まあ必要かって言われると必要じゃないので、別にいいんですけど。

ところで、じゃあSupervisorとか使ってるとどうなるかというと、ルート権限がないって怒られるわけです。
じゃあどうすればいいかっていうと、CMD ["sudo", "supervisord"]とかしてやればいいです。
sudoerに追加してあげないと、たぶんパスワード入力しろって怒られるような気もしてます。

以上を踏まえて

新生・コンテナの中のPHPUnitを叩く君は以下のようになります。

command.sh
#!/bin/bash

CONTAINER_NAME=exectest

docker exec $CONTAINER_NAME $@

・・・これ別にShellScriptにしなくていいですよね? というわけで結論。

追記

こんなことのためにDockerfile弄るのも悔しいというか、何とかできないと思ってたところ、よくよく考えると↓でいいんじゃないかと思い始めた。

command.sh
#!/bin/bash

CONTAINER_NAME=exectest

docker exec $CONTAINER_NAME su -l webapp -c "cd /home/webapp/app; $*"

盲点。。。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5