DockerでTomcat（メモ）

# やろうとしたこと

* スマフォアプリのサーバ環境（固定のJSONを返すスタブ）をDockerのコンテナ上で動かす（Docker初心者なので何かしらで活用機会を作りたかった）
* Dockerfileの雛形が[こちら](https://docs.docker.com/samples/library/tomcat/)で提供されていたので利用させていただく
* 今回は[こちら](https://github.com/docker-library/tomcat/blob/5a78361a9ce7ef48979acbcabe2acd9342d0168a/8.0/jre8-alpine/Dockerfile)を利用

# Docker環境

![Docker.jpg](https://qiita-image-store.s3.amazonaws.com/0/165162/05866191-3ab9-b65b-bfec-1bd601aee9f4.jpeg)

# 問題その１（プロキシ）

私の環境ではプロキシ越しでのビルドすることになるので、`--build-arg`でプロキシ設定を渡す必要がありました。

```
$ docker build . --build-arg HTTP_PROXY=(プロキシサーバ)
```

# 問題その２（gpg：解決せず）

gpgでキーサーバから公開鍵を取得するところでエラーに。

```
+ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 05AB33110949707C93A279E3D3EFE6B686867BA6
gpg: directory '/root/.gnupg' created
gpg: new configuration file '/root/.gnupg/dirmngr.conf' created
gpg: new configuration file '/root/.gnupg/gpg.conf' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: keyserver receive failed: No name
```

またしてもプロキシなのかと考えて、[マニュアル](https://www.gnupg.org/documentation/manuals/gnupg.pdf)を確認してみると、`--keyserver-options`で指定できるようなので、指定するようにしてみました。

```
+ gpg --keyserver ha.pool.sks-keyservers.net --keyserver-options http-proxy=(プロキシサーバ)　--recv-keys 05AB33110949707C93A279E3D3EFE6B686867BA6
gpg: directory '/root/.gnupg' created
gpg: new configuration file '/root/.gnupg/dirmngr.conf' created
gpg: new configuration file '/root/.gnupg/gpg.conf' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: keyserver receive failed: No keyserver available
```

エラーのメッセージは変わりましたが、結果としてはエラーのままです。
なお、インストールされたgppのバージョンは、

```
$ gpg --version
gpg (GnuPG) 2.1.20
libgcrypt 1.7.9
```

でした。
ひとまず先に進めるため、この部分（さらに後ろの手順でダウンロードするtomcat.tar.gzのverifyを実行している箇所も）はコメントしてエラー回避しました。（対処方法をご存知の方は教えていただけると幸いです）

# 問題その３（wget：無理やりエラー回避）

tomcatのアーカイブを取得するところでエラーになりました。

```
+ wget -O tomcat.tar.gz https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz
wget: bad address 'www.apache.org'
```

またしてもプロキシのようです。
`--build-arg`でプロキシ設定を渡すようにしていましたが、wgetの場合は`http_proxy`でないとダメなようです。

```
$ docker build . --build-arg HTTP_PROXY=(プロキシサーバ) --build-arg http_proxy=(プロキシサーバ)
```

別のエラーになりました。

```
+ wget -O tomcat.tar.gz https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz
Connecting to (プロキシサーバ)
wget: error getting response: Connection reset by peer
```

こちらの原因も結局わからずでした。
ですが、さすがにこの箇所を「コメントで回避」するわけにはいかないので、curlをインスールしてwgetを使わないようにしました。

```sh
for url in $TOMCAT_TGZ_URLS; do \
	if curl -o tomcat.tar.gz "$url"; then \
		success=1; \
		break; \
	fi; \
done; \
```

また、`--build-arg`を

```
--build-arg https_proxy=(プロキシサーバ)
```

に変更しました。

# ようやくビルドが成功

```
$ docker build -t tomcat8.0.47 . --build-arg HTTP_PROXY=http://172.16.248.253:8080 --build-arg https_proxy=http://172.16.248.253:8080
$ docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
tomcat8.0.47             latest              75daf8b18457        About an hour ago   113MB
$ docker run --name tomcat -itd -p 18080:8080 tomcat8.0.47
```

MacからTomcatに接続できるようになりました。

そういえば、スタブの配置ができてないです。。。
配置できたらまた更新します。