designetwork

ネットワークを軸としたIT技術メモ

Proxy環境のDocker RedmineでGemインストールするための設定

(2018/4/28 Update 別原因だったため訂正)

Docker Redmineへのプラグイン追加の際、Gemパッケージのインストールが必要となる場合には、docker-compose.ymlでProxy環境変数を設定する。

.gemrcの配備が必要となる。

発生した問題と調査内容、対応方法を示す。

前提環境

Redmine Docker Image: sameersbn/docker-redmine

github.com

こちらのdocker-compose.ymlで各パラメータを設定している。

docker-redmine/docker-compose.yml at master · sameersbn/docker-redmine · GitHub

環境変数でのProxy設定

コンテナへの環境変数設定はdocker-compose.ymlで定義している。docker-compose.ymlファイルに認証情報を含むプロキシ情報は記載したくないので、ホストOSの環境変数を引き継ぐようにしている。

version: '2'

services:
  redmine:
    image: sameersbn/redmine:3.4.4-2
    container_name: redmine
    depends_on:
    - postgresql
    restart: always
    environment:
    - TZ=Asia/Tokyo
    - HTTP_PROXY=${HTTP_PROXY}
    - http_proxy=${HTTP_PROXY}
    - HTTPS_PROXY=${HTTPS_PROXY}
    - https_proxy=${HTTPS_PROXY}
    - NO_PROXY=${NO_PROXY}
    - no_proxy=${NO_PROXY}
    <snip>

問題動作

このログの通り、Gemでのインストールに失敗している。UnknownHostErrorのログより、Proxyに通信していないことが原因となっている。ホストOSでのtcpdumpからも、rubygems.orgの名前解決(DNS)要求が発生していた。(本来はDNSなしでProxy通信)

$docker-compose up
Starting postgres-redmine ... 
Starting postgres-redmine ... doneRecreating redmine        ... 
Recreating redmine        ... doneAttaching to postgres-redmine, redmine
postgres-redmine | Initializing datadir...
redmine       | Initializing logdir...
redmine       | Initializing datadir...
redmine       | Symlinking dotfiles...
redmine       | Installing configuration templates...
redmine       | Configuring redmine...
postgres-redmine | Initializing certdir...
postgres-redmine | Initializing logdir...
postgres-redmine | Initializing rundir...
postgres-redmine | Setting resolv.conf ACLs...
postgres-redmine | Creating database user: redmine
postgres-redmine | Creating database: redmine_production...
postgres-redmine | ? Granting access to redmine user...
postgres-redmine | Starting PostgreSQL 9.6...
postgres-redmine | LOG:  database system was shut down at 2018-04-19 12:22:57 UTC
postgres-redmine | LOG:  MultiXact member wraparound protections are now enabled
postgres-redmine | LOG:  database system is ready to accept connections
postgres-redmine | LOG:  autovacuum launcher started
redmine       | Configuring redmine::database...
redmine       | Configuring redmine::unicorn...
redmine       | Configuring redmine::secret_token...
redmine       | Generating a session token...
redmine       | Note:
redmine       |   All old sessions will become invalid.
redmine       |   Please specify the REDMINE_SECRET_TOKEN parameter for persistence.
redmine       |   **SHOULD** be defined if you have a load-balancing Redmine cluster.
redmine       | Configuring redmine::max_concurrent_ajax_uploads...
redmine       | Configuring redmine::sudo_mode...
redmine       | Configuring redmine::autologin_cookie...
redmine       | Configuring redmine::email_delivery...
redmine       | Configuring redmine::backups...
redmine       | Configuring redmine::backups::schedule...
redmine       | Configuring nginx...
redmine       | Configuring nginx::redmine...
redmine       | Installing plugins...
redmine       | Installing gems required by plugins...
redmine       | Gem::RemoteFetcher::UnknownHostError: no such name
redmine       | (https://rubygems.org/gems/rubyzip-1.2.1.gem)
redmine       | An error occurred while installing rubyzip (1.2.1), and Bundler cannot continue.
redmine       | Make sure that `gem install rubyzip -v '1.2.1'` succeeds before bundling.
redmine       | 
redmine       | In Gemfile:
redmine       |   write_xlsx was resolved to 0.85.3, which depends on
redmine       |     zip-zip was resolved to 0.3, which depends on
redmine       |       rubyzip
redmine exited with code 5

gemは基本的に環境変数http_proxy, https_proxyを設定していれば問題ないはずだが、私の環境では期待動作とならなかった。

.gemrcファイルをRedmineコンテナに配備する

BundleとGemインストールでProxyの設定方法が異なるという情報を見た気がするので、設定方法を変更する。上記(とtcpdumpでの切り分け)より、パッケージ情報は取得できているためBundlerは問題なく、Gem installの際に期待するProxy動作となっていないと特定できる。

そのため、GemのProxy設定の一つである.gemrcをコンテナに配備した。

no_proxyの設定が誤っていた

原因はこちらにまとめた通り、no_proxyの設定誤りだった。

designetwork.hatenablog.com

(NG) no_proxy=,localhost,127.0.0.1
(OK) no_proxy=localhost,127.0.0.1

問題解消

上記no_proxyの修正により、プラグインで必要となるGemパッケージのインストールでも正常にProxy通信が可能となった。

まとめ - Proxy環境のDocker RedmineでGemインストールするための設定

Proxy環境において、no_proxyを設定する場合に、記載が誤っているとGemパッケージのダウンロードに失敗する。

no_proxyを適切に設定することで、Redmineプラグインで追加で必要となるGemパッケージについてもProxy経由でRubygemsからダウンロードすることができるようになった。