見分ける方法はあるか貨物すべての依存関係をインストールしてビルドしますが、アプリケーションのビルドは試行しませんか?
そうするつもりcargo install
でしたが、実際にはアプリのビルドまですべて実行されてしまいます。ディレクトリcargo build
に触れることなく、すべての依存関係が使用できる状態に到達したいのです/src
。
私が本当に達成しようとしていること:
Rust アプリケーション用の Docker イメージを構築しようとしています。次の手順を実行したいと思います。
ビルド時間(docker build .
):
- RustツールがインストールされたDockerイメージをインポートする
- Cargo.tomlとCargo.lockファイルを追加する
- すべての依存関係をダウンロードしてビルドする
- ソースディレクトリをイメージに追加する
- ソースコードをビルドする
実行時間(docker run ...
):
- アプリケーションを実行する
以下のことを試しましたDockerfile
が、示された手順でアプリケーションもビルドされます (もちろん、ソース ディレクトリがまだ存在しないため失敗します)。
FROM jimmycuadra/rust
ADD Cargo.toml /source
ADD Cargo.lock /source
RUN cargo install # <-- failure here
ADD src /source/src
RUN cargo build
ENTRYPOINT cargo run
依存関係のインストール手順とアプリケーションの実際のビルドを分離したい理由は、依存関係を変更しない場合、Dockerがすべての依存関係がすでにインストールされビルドされたキャッシュされたイメージを使用できるようにするためです。したがってADD /src /source/src
、後依存関係をインストールしないと、独自のコードを変更したときにキャッシュされたイメージが無効になります。
ベストアンサー1
私の知る限り、Cargoには依存関係だけをビルドするためのネイティブサポートはありません。それは未解決の問題である. ただし、Cargo に何かを送信してこれを実現したり、サードパーティの Cargo アドオンを作成したりできるとしても驚きではありません。cargo doc
自分のコードが壊れていてコンパイルできないときにも、この機能が欲しかったのです ;-)
しかし錆びた遊び場私が主張するところによると、最終目標は達成される。ベースDockerコンテナRustupをインストールしてコピーするCargo.toml
遊び場に利用できるすべての木箱付き。ビルド手順では、空のプロジェクト(ダミーsrc/lib.rs
)を作成し、 を呼び出してcargo build
クレートcargo build --release
をコンパイルします。:
RUN cd / && \
cargo new playground
WORKDIR /playground
ADD Cargo.toml /playground/Cargo.toml
RUN cargo build
RUN cargo build --release
RUN rm src/*.rs
ダウンロードされたすべてのクレートは Docker イメージの$HOME/.cargo
ディレクトリに保存され、ビルドされたすべてのクレートはアプリケーションtarget/{debug,release}
ディレクトリに保存されます。
その後、実際のソース ファイルがコンテナーにコピーされ、コンパイルされたクレートを使用して再度実行できるようになりますcargo build
。cargo run
実行可能なプロジェクトをビルドする場合は、Cargo.lock もコピーする必要があります。