私のdockerエッセイ12:dockerソースコードコンパイル
5272 ワード
作業ではソースコードからdockerをコンパイルする必要があるため,本稿ではこれを紹介する.
dockerのコンパイルは,ホストにdockerソフトウェアを予めインストールする必要がある.dockerのソースコードをコンパイルすると、dockerミラーが構築されて実行されるので、このコンテナでbuild操作を行います.このコンテナにはgo言語環境が含まれているため、ホストにgolangを追加インストールする必要はありません.ホストシステム:
dockerのgithub公式サイトは:https://github.com/docker/docker-ce/. dockerは毎月1つのバージョンをリリースするリズムで開発されています.命名規則は、ceがコミュニティバージョンを表す
docker-ceディレクトリにアクセスするには、次の手順に従います.
最新のtagに切り替え:
このセクションの作業ディレクトリは/home/latelee/docker/dev/docker-ceディレクトリです.
次のセクションのコンパイルコマンドを実行するとエラーが発生するため、Dockerfileファイルを事前に変更する必要があります.コンパイル時にdockerミラーが構築され、実際に実行されるコマンドは(components/packaging/debからのmakefileであり、解析によって生成される):
ディレクトリへのアクセス:
debディレクトリの下のMakefileは、コンパイルされたdebパッケージを指定します.コンパイルコマンドを実行するには、次の手順に従います.
コマンドの説明:このコマンドはバージョン番号とdockerコンポーネントのディレクトリ(VERSION、ENGINE、CLIはそれぞれバージョン番号、dockerエンジン、dockerコマンドラインを指す)を指定し、コンパイルするシステムバージョン(ubuntu 16.04代名詞xenial)を指定します.これは、本明細書ではすべてのバージョンをコンパイルするのではなく、1つのシステムバージョンのみをコンパイルするためです.
30分ほどでコンパイルに成功しました.最終的に生成されたdebパケットは、
得られたdebパッケージをネイティブまたは他のubuntuシステムに保存し、以下のコマンドを実行してインストールします.
バージョン番号を確認するには、次の手順に従います.
これでdockerのコンパイルが終わります.
docker-ceソースディレクトリは次のとおりです.
コンポーネントディレクトリにはcli、engine、packagingの3つのサブディレクトリが含まれます.最初の2つはgoコードが存在するディレクトリであり,packagingは最終バイナリファイルを構築するディレクトリである.内容は次のとおりです.
ここでdebディレクトリはコンパイルしてdebファイルを生成し、異なるシステムバージョン(ubuntuとdebianなど)を区別し、ubuntuは異なるバージョンを代号で区別し、trustyは14.04、xenialは16.04など)を表す.例えばubuntu-xenialディレクトリには、16.04ベースの異なるプラットフォームのDockerfileが含まれています.build-debは、前述したコンテナで実行されるコンパイルスクリプトです.詳細な分析は、後続のドキュメントで提供されます.
releaseバージョンをダウンロードしてコンパイルすると、このようなエラーが発生します.
解決方法:gitを使用してコードウェアハウスをダウンロードし、パブリッシュバージョンのブランチに切り替えてコンパイルします.
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バージョンの更新が非常に速いため、本明細書では参照に供します.