レジストリをソースからビルド

使用例

レジストリを活用したい場合に役立ちます。

あるいは

多くの皆さんは 公式 Registry Docker イメージ を使ったほうが良いでしょう。

高度な使い方を考えている皆さんであれば、 FROM registry:2 以降の Dockerfile をカスタマイズし、自分でイメージを作成したいと考えているかもしれません。

OS X ユーザであれば こちらの手順 をご覧ください。

捕捉

既に Go 言語や git の使い方について理解している前提です。

これまで開発経験のないカジュアルのユーザであり、Go 言語に関する予備知識が無いのであれば、ソースコードからビルドする方法は、あなたにとって適切ではないかもしれません。

開発環境の構築

まず、利用環境に対して適切な Go 開発環境をセットアップする必要があります。適切なセットアップ方法は Goコードの書き方(英語) をご覧ください。正しく終わったら、環境変数の GOROOT と GOPATH が設定されているでしょう。

Go 開発環境をセットアップしたら、 go get コマンドを使って最新バージョンの registry をインストールします。

go get github.com/docker/distribution/cmd/registry

ソース・リポジトリから GOPATH にインストールします。

次にレジストリ・データ用のディレクトリを作成します(パーミッションを適切に設定する必要があるでしょう)。

あるいは別の場所に保管したい場合は export REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/somewhere を実行します。

レジストリのバイナリを以下の場所に設置します。

$ $GOPATH/bin/registry --version
$GOPATH/bin/registry github.com/docker/distribution v2.0.0-alpha.1+unknown

注釈

プロジェクトから go get でチェックアウトしなくても、ビルド手順は動くするでしょう。しかし、 GOPATH の適切な場所にプロジェクトがなければチェックアウトできません。通常は $GOPATH/src/github.com/docker/distribution です。

次の定型コマンドを実行すると、レジストリは標準のオプションで起動します。

$ $GOPATH/bin/registry $GOPATH/src/github.com/docker/distribution/cmd/registry/config-example.yml
INFO[0000] endpoint local-5003 disabled, skipping        app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
INFO[0000] endpoint local-8083 disabled, skipping        app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
INFO[0000] listening on :5000                            app.id=34bbec38-a91a-494a-9a3f-b72f9010081f version=v2.0.0-alpha.1+unknown
INFO[0000] debug server listening localhost:5001

動作しない場合は、ログメッセージの内容を確認すべきです。

ビルドを繰り返す

完全な開発経験のためには、 cd$GOPATH/src/github.com/docker/distribution に移動すべきです。ここから go test のような通常の go コマンドを実行しても、パッケージが動くでしょう。動かない場合は レジストリの開発 をご覧ください。

繰り返しのビルドが便利になるように Makefile が提供されています。動作するためには GOPATH にインストールします。

go get github.com/tools/godep github.com/golang/lint/golint

TODO(原文ママ) make setup コマンドを Makefile の実行時に追加。Godeps が適切に働くか考慮する必要がある。

GOPATH でコマンドが実行可能であれば、 make によってビルドできます。

$ GOPATH=`godep path`:$GOPATH make
+ clean
+ fmt
+ vet
+ lint
+ build
github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar
github.com/Sirupsen/logrus
github.com/docker/libtrust
...
github.com/yvasiyarov/gorelic
github.com/docker/distribution/registry/handlers
github.com/docker/distribution/cmd/registry
+ test
...
ok    github.com/docker/distribution/digest 7.875s
ok    github.com/docker/distribution/manifest 0.028s
ok    github.com/docker/distribution/notifications  17.322s
?     github.com/docker/distribution/registry [no test files]
ok    github.com/docker/distribution/registry/api/v2  0.101s
?     github.com/docker/distribution/registry/auth  [no test files]
ok    github.com/docker/distribution/registry/auth/silly  0.011s
...
+ /Users/sday/go/src/github.com/docker/distribution/bin/registry
+ /Users/sday/go/src/github.com/docker/distribution/bin/registry-api-descriptor-template
+ binaries

これは Godeps の指定したディレクトリでビルドする度に表示されるでしょう。ここには formatting 、 vetting 、 linting 、 building 、 testing 、generating とタグ付けされたバイナリが作成されています。生成されたバイナリが実行可能か確認するには ./bin ディレクトリに移動します。

$ ./bin/registry -version
./bin/registry github.com/docker/distribution v2.0.0-alpha.2-80-g16d8b2c.m

レジストリの開発

上記の手法は小さな実験に役立つでしょう。より複雑なタスクをこなしたい場合は godep の力を使うことを推奨します。

Makefile は外部の定義 GOPATH に依存するよう設計されています。これは様々な環境にセットアップできるようにするためです。便利なのは、主にアップストリームのバグ修正のため、ローカルのコードを変更する場合です。そのためには godep を移行して GOPATH の依存関係を解決する必要があります。 GodepsGOPATH にある現在の依存関係を解消するには、次のコマンドを実行します。

godep restore

警告

このコマンドは Godeps/Godeps.json で指定されたコードに対してチェックアウトすると GOPATH の中にあるファイルを編集します。そうしたくない場合は、分岐したプロジェクトで使うため、別のワークスペースを作成することを推奨します。

上記のコマンドに成功すると、 GOPATH を指定せず make します。

make

成功すると go test のような通常の go コマンドをパッケージごとに実行しても、問題無く動作するでしょう。

build tag のオプション

オプションの build tags は環境変数 DOCKER_BUILDTAGS で指定できます。

Ceph RADOS ストレージ・ドライバ を有効にするには( librados-dev と librdb-dev がビルド時に必要となります)、次のように実行します。

export DOCKER_BUILDTAGS='include_rados'

参考

Building the registry source
https://docs.docker.com/registry/building/