私のdockerエッセイ12:dockerソースコードコンパイル

5272 ワード

作業ではソースコードからdockerをコンパイルする必要があるため,本稿ではこれを紹介する.

一、環境構築


dockerのコンパイルは,ホストにdockerソフトウェアを予めインストールする必要がある.dockerのソースコードをコンパイルすると、dockerミラーが構築されて実行されるので、このコンテナでbuild操作を行います.このコンテナにはgo言語環境が含まれているため、ホストにgolangを追加インストールする必要はありません.ホストシステム:ubuntu 16.04 64bitホストdockerバージョン:
docker -v
Docker version 17.10.0-ce, build f4ffd25

二、ソースコードのダウンロード


dockerのgithub公式サイトは:https://github.com/docker/docker-ce/. dockerは毎月1つのバージョンをリリースするリズムで開発されています.命名規則は、ceがコミュニティバージョンを表す - -ceです.本明細書の作成時までの最新バージョンはv17.12.0-ceであったが、次のバージョンv18.01.0-ce-devはすでに開発段階(devで開発段階を示す)にあり、本明細書でコンパイルされたバージョンはv18.01.0-ce-devであった.リリース・リリースのダウンロード・アドレス:https://github.com/docker/docker-ce/releases. この文書は/home/latelee/docker/devディレクトリで行います.実際の状況に応じてディレクトリを変更してください.ソースのダウンロード:
git clone https://github.com/docker/docker-ce

docker-ceディレクトリにアクセスするには、次の手順に従います.
cd docker-ce

最新のtagに切り替え:
git checkout -b v18.01.0-ce

三、コンパイルプロセス


このセクションの作業ディレクトリは/home/latelee/docker/dev/docker-ceディレクトリです.

Dockerfileの変更


次のセクションのコンパイルコマンドを実行するとエラーが発生するため、Dockerfileファイルを事前に変更する必要があります.コンパイル時にdockerミラーが構築され、実際に実行されるコマンドは(components/packaging/debからのmakefileであり、解析によって生成される):docker build -t debbuild-ubuntu-xenial/x86_64 -f /home/latelee/docker/dev/docker-ce/components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64 .です.components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64ファイルを分析し、構築プロセスでgolangコンパイラをダウンロードすることを知った.golang.orgはアクセスできず、最後に構築に失敗します.そのため、ダウンロードソースを更新する必要があります.解決方法:国内でダウンロードできるサイトを探します.のようにhttps://dl.gocn.io/. components/packaging/deb/ubuntu-xenial/Dockerfile.x86_64ファイルを修正します.RUN curl -fSL "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"; | tar xzC /usr/localを:RUN curl -fSL "https://dl.gocn.io/golang/${GO_VERSION}/go${GO_VERSION}.linux-amd64.tar.gz"; | tar xzC /usr/localに変更すると、最終的にミラー:debbuild-ubuntu-xenial/x86_64が構築されます.このミラーは、後でコンパイルで使用されるため、削除する必要はありません.

コンパイル


ディレクトリへのアクセス:
cd components/packaging/deb

debディレクトリの下のMakefileは、コンパイルされたdebパッケージを指定します.コンパイルコマンドを実行するには、次の手順に従います.
make  VERSION=18.01.0-ce-dev ENGINE_DIR=/home/latelee/docker/dev/docker-ce/components/engine CLI_DIR=/home/latelee/docker/dev/docker-ce/components/cli ubuntu-xenial

コマンドの説明:このコマンドはバージョン番号とdockerコンポーネントのディレクトリ(VERSION、ENGINE、CLIはそれぞれバージョン番号、dockerエンジン、dockerコマンドラインを指す)を指定し、コンパイルするシステムバージョン(ubuntu 16.04代名詞xenial)を指定します.これは、本明細書ではすべてのバージョンをコンパイルするのではなく、1つのシステムバージョンのみをコンパイルするためです.

ファイルの生成


30分ほどでコンパイルに成功しました.最終的に生成されたdebパケットは、components\packaging\deb\debbuild\ubuntu-xenialにある.debファイル:docker-ce_18.01.0~ce~dev~git20171228.105814.0.486a48d-0~ubuntu_amd64.deb

インストール


得られたdebパッケージをネイティブまたは他のubuntuシステムに保存し、以下のコマンドを実行してインストールします.
# dpkg -i docker-ce_18.01.0~ce~dev~git20171228.105814.0.486a48d-0~ubuntu_amd64.deb

バージョン番号を確認するには、次の手順に従います.
# docker -v
Docker version 18.01.0-ce-dev, build 486a48d

これでdockerのコンパイルが終わります.

四、dockerソースディレクトリの分析


docker-ceソースディレクトリは次のとおりです.
.
├── CHANGELOG.md
├── components  #     
│   ├── cli
│   ├── engine
│   └── packaging
├── components.conf
├── CONTRIBUTING.md
├── Makefile #     
├── README.md #     
└── VERSION #     

4 directories, 6 files

コンポーネントディレクトリにはcli、engine、packagingの3つのサブディレクトリが含まれます.最初の2つはgoコードが存在するディレクトリであり,packagingは最終バイナリファイルを構築するディレクトリである.内容は次のとおりです.
.
├── deb
│   ├── build-deb
│   ├── common
│   ├── debbuild
│   ├── debian-buster
│   ├── debian-jessie
│   ├── debian-stretch
│   ├── debian-wheezy
│   ├── Makefile
│   ├── raspbian-jessie
│   ├── raspbian-stretch
│   ├── README.md
│   ├── systemd
│   ├── ubuntu-artful
│   ├── ubuntu-trusty
│   └── ubuntu-xenial
├── Jenkinsfile
├── Makefile
├── README.md
├── rpm
│   ├── centos-7
│   ├── fedora-26
│   ├── fedora-27
│   ├── gen-rpm-ver
│   ├── Makefile
│   ├── README.md
│   └── systemd
└── static
    ├── hash_files
    └── Makefile

ここでdebディレクトリはコンパイルしてdebファイルを生成し、異なるシステムバージョン(ubuntuとdebianなど)を区別し、ubuntuは異なるバージョンを代号で区別し、trustyは14.04、xenialは16.04など)を表す.例えばubuntu-xenialディレクトリには、16.04ベースの異なるプラットフォームのDockerfileが含まれています.build-debは、前述したコンテナで実行されるコンパイルスクリプトです.詳細な分析は、後続のドキュメントで提供されます.

ふろく


releaseバージョンをダウンロードしてコンパイルすると、このようなエラーが発生します.
# WARNING! I don't seem to be running in a Docker container.
# The result of this command might be an incorrect build, and will not be
# officially supported.
#
# Try this instead: make all
#
error: .git directory missing and DOCKER_GITCOMMIT not specified
  Please either build with the .git directory accessible, or specify the
  exact (--short) commit hash you are building using DOCKER_GITCOMMIT for
  future accountability in diagnosing build issues.  Thanks!
make[1]: *** [override_dh_auto_buil

解決方法:gitを使用してコードウェアハウスをダウンロードし、パブリッシュバージョンのブランチに切り替えてコンパイルします.
dockerバージョンの更新が非常に速いため、本明細書では参照に供します.