はじめに
Libra Clinetのインストールは割と簡単にできますが、ホストの環境によってはうまく行かない事があります。
公式リポジトリ内にdockerfileが用意されていますので、今回はdockerでLibra Clientを立ち上げます。
※投稿日(2020年5月16日)時点でdocker build中にエラーが発生して、buildを完了させられていません。対処が出来次第、対処方法も含めて追記していきます。
環境
私が試した際の環境です。
OS : macOS Catalina 10.15.4
Docker : 19.03.8
必須環境は不明ですがdockerfileの記載から、dockerはver.17.05以上である事が必要だと考えられます。
Libra 公式 github リポジトリ
ソースコードを取得
まずは、適当なディレクトリに公式githubリポジトリをクローンします。
git clone https://github.com/libra/libra.git
cd libra
docker build
docker-imageを作るためのコマンドまで公式で用意してくれているので、それを使います。
./docker/client/build.sh
libra/docker/client/build.sh
#!/bin/sh
# Copyright (c) The Libra Core Contributors
# SPDX-License-Identifier: Apache-2.0
set -e
DIR="$( cd "$( dirname "$0" )" && pwd )"
PROXY=""
if [ "$https_proxy" ]; then
PROXY=" --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy"
fi
docker build \
-f $DIR/Dockerfile $DIR/../.. --tag libra_client \
--build-arg GIT_REV="$(git rev-parse HEAD)" \
--build-arg GIT_UPSTREAM="$(git merge-base HEAD origin/master)" \
--build-arg BUILD_DATE="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
$PROXY
OSイメージがFROM debian:buster です。
apt-get updateを含んでいるため、docker build 完了までに時間がかかりますので、しばらく待機します。
OSに含まれているパッケージ類を全てupdateするので時間がかかるのですね。
また、FROMが3つ書かれていることからmulti stage build だということがわかります。
この点からdockerのバージョンは17.05以上である事が必要です。
libra/docker/client/Dockerfile
FROM debian:buster AS toolchain
# To use http/https proxy while building, use:
# docker build --build-arg https_proxy=http://fwdproxy:8080 --build-arg http_proxy=http://fwdproxy:8080
RUN apt-get update && apt-get install -y cmake curl clang git
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
ENV PATH "$PATH:/root/.cargo/bin"
WORKDIR /libra
COPY rust-toolchain /libra/rust-toolchain
RUN rustup install $(cat rust-toolchain)
FROM toolchain AS builder
COPY . /libra
RUN cargo build --release -p libra-node -p cli -p config-builder -p safety-rules && cd target/release && rm -r build deps incremental
RUN strip target/release/cli
### Production Image ###
FROM debian:buster AS prod
RUN mkdir -p /opt/libra/bin /opt/libra/etc
COPY --from=builder /libra/target/release/cli /opt/libra/bin/libra_client
ENTRYPOINT ["/opt/libra/bin/libra_client"]
CMD ["--url", "http://client.testnet.libra.org"]
ARG BUILD_DATE
ARG GIT_REV
ARG GIT_UPSTREAM
LABEL org.label-schema.schema-version="1.0"
LABEL org.label-schema.build-date=$BUILD_DATE
LABEL org.label-schema.vcs-ref=$GIT_REV
LABEL vcs-upstream=$GIT_UPSTREAM
Dockerfileを見ると、CMD ["--url", "http://client.testnet.libra.org"] となっているので、テストネットに繋がる事がわかります。
libra/scripts/cli/start_cli_testnet.sh の RUN_PARAMS(16行目) 内の引数と同様ですね。
libra/scripts/cli/start_cli_testnet.sh
#!/bin/bash
# Copyright (c) The Libra Core Contributors
# SPDX-License-Identifier: Apache-2.0
print_help()
{
echo "Build client binary and connect to testnet."
echo "\`$0 -r|--release\` to use release build or"
echo "\`$0\` to use debug build."
}
source "$HOME/.cargo/env"
SCRIPT_PATH="$(dirname $0)"
RUN_PARAMS="--url https://client.testnet.libra.org --waypoint_url https://developers.libra.org/testnet_waypoint.txt"
RELEASE=""
while [[ ! -z "$1" ]]; do
case "$1" in
-h | --help)
print_help;exit 0;;
-r | --release)
RELEASE="--release"
;;
--)
shift
break
;;
*) echo "Invalid option"; print_help; exit 0;
esac
shift
done
if [ -z "$RELEASE" ]; then
echo "Building and running client in debug mode."
else
echo "Building and running client in release mode."
fi
cargo run -p cli $RELEASE -- $RUN_PARAMS "$@"
docker run
docker build が完了したらdocker runコンテナを作ります。
と思いきや私の環境ではまさかのエラー発生。。。
以下のステップでエラーによりbuild停止となりました。
Step 10/23 : RUN cargo build --release -p libra-node -p cli -p config-builder -p safety-rules && cd target/release && rm -r build deps incremental
エラー内容は以下の通りです。
Compiling libra-node v0.1.0 (/libra/libra-node)
error: could not compile `libra-node`.
Caused by:
process didn't exit successfully: \
`rustc \
--crate-name libra_node \
--edition=2018 libra-node/src/main.rs \
--error-format=json \
--json=diagnostic-rendered-ansi \
--crate-type bin \
--emit=dep-info,link \
-C opt-level=3 \
-C lto=thin \
-C debuginfo=2 \
--cfg 'feature="default"' \
-C metadata=96a33b5413f859e5 \
-C extra-filename=-96a33b5413f859e5 \
--out-dir /libra/target/release/deps \
-L dependency=/libra/target/release/deps \
--extern admission_control_proto=/libra/target/release/deps/libadmission_control_proto-8d8452a9c0975577.rlib \
--extern admission_control_service=/libra/target/release/deps/libadmission_control_service-67400bf2041e283c.rlib \
--extern backup_service=/libra/target/release/deps/libbackup_service-f0d8a4efddc6ae52.rlib \
--extern consensus=/libra/target/release/deps/libconsensus-f1371a3795689926.rlib \
--extern crash_handler=/libra/target/release/deps/libcrash_handler-928f748a5932986f.rlib \
--extern debug_interface=/libra/target/release/deps/libdebug_interface-3949a35c14a46f1b.rlib \
--extern executor=/libra/target/release/deps/libexecutor-89b666f1d81ef44e.rlib \
--extern executor_types=/libra/target/release/deps/libexecutor_types-e8be8d5989f875bb.rlib \
--extern futures=/libra/target/release/deps/libfutures-298a5cb0c6a5408c.rlib \
--extern jemallocator=/libra/target/release/deps/libjemallocator-1ec6195a29d7142b.rlib \
--extern libra_config=/libra/target/release/deps/liblibra_config-4a9eecda88e25c79.rlib \
--extern libra_crypto=/libra/target/release/deps/liblibra_crypto-e10f95e242a39a38.rlib \
--extern libra_json_rpc=/libra/target/release/deps/liblibra_json_rpc-6b0755cc43d049e6.rlib \
--extern libra_logger=/libra/target/release/deps/liblibra_logger-bec4c3005ae15489.rlib \
--extern libra_mempool=/libra/target/release/deps/liblibra_mempool-9b9f1f704a1a8f6b.rlib \
--extern libra_metrics=/libra/target/release/deps/liblibra_metrics-d768a8c1c7b51ee2.rlib \
--extern libra_node=/libra/target/release/deps/liblibra_node-412e265aaf46f792.rlib \
--extern libra_types=/libra/target/release/deps/liblibra_types-48a90fd0269ff1f1.rlib \
--extern libra_vm=/libra/target/release/deps/liblibra_vm-1ce4c30f9f087754.rlib \
--extern libra_workspace_hack=/libra/target/release/deps/liblibra_workspace_hack-4ad2e3d404a3b7f2.rlib \
--extern libradb=/libra/target/release/deps/liblibradb-e9113b4d1f626fbf.rlib \
--extern network=/libra/target/release/deps/libnetwork-4dd7340ffd0d5af4.rlib \
--extern onchain_discovery=/libra/target/release/deps/libonchain_discovery-9f97ffc5366b0c0a.rlib \
--extern rayon=/libra/target/release/deps/librayon-7dd857e955b205dd.rlib \
--extern state_synchronizer=/libra/target/release/deps/libstate_synchronizer-cd410ecc5bf90d68.rlib \
--extern storage_client=/libra/target/release/deps/libstorage_client-adbcb0843c579de8.rlib \
--extern storage_interface=/libra/target/release/deps/libstorage_interface-bd98fd2e8b075a5a.rlib \
--extern storage_service=/libra/target/release/deps/libstorage_service-6540a974cbcd9dfd.rlib \
--extern structopt=/libra/target/release/deps/libstructopt-950c81f94f0c09cd.rlib \
--extern subscription_service=/libra/target/release/deps/libsubscription_service-1d4fb903e3f5ef70.rlib \
--extern tokio=/libra/target/release/deps/libtokio-9513cdb45925981f.rlib \
--extern tonic=/libra/target/release/deps/libtonic-5e37d7f3e1a90b7c.rlib \
-L native=/libra/target/release/build/clear_on_drop-d439bb0b63485838/out \
-L native=/libra/target/release/build/ring-41bad835a91d32f6/out \
-L native=/libra/target/release/build/librocksdb-sys-8622633f277a3e2d/out \
-L native=/libra/target/release/build/librocksdb-sys-8622633f277a3e2d/out \
-L native=/libra/target/release/build/jemalloc-sys-a06c9ea9cd60e357/out/build/lib` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
The command '/bin/sh -c cargo build --release -p libra-node -p cli -p config-builder -p safety-rules && cd target/release && rm -r build deps incremental' returned a non-zero code: 101
libra-nodeのcompileに失敗しています。
原因を調べて対処できれば、また追記していきます。