22 April 2020 [Docker, Programming, Rust, Tech]
Saya sedang membangun proyek mainan di Rust untuk membantu saya mempelajari cara menerapkan berbagai hal di AWS. Saya sedang mempertimbangkan untuk menggunakan Elastic Beanstalk (platform-as-a-service AWS) dan juga Kubernetes. Kedua hal ini mendukung penerapan melalui container Docker, jadi saya mempelajari cara mengemas Rust yang dapat dieksekusi sebagai image Docker.
Program saya adalah situs web kecil yang menggunakan Redis sebagai database back end. Ini terdiri dari beberapa kode Rust dan beberapa file statis.
Karena Rust memiliki dukungan yang baik untuk membangun executable dengan sangat sedikit ketergantungan, kita sebenarnya dapat membangun image Docker dengan hampir tidak ada apa pun di dalamnya, kecuali program saya dan file statis.
Berkat postingan blog Alexander Brand Cara Mengemas Aplikasi Rust ke dalam Kontainer Docker Minimal, saya dapat membuat image Docker yang:
- Sangat kecil
- Tidak memakan waktu terlalu lama untuk membangunnya
Kekhawatiran utama untuk membuat pembangunan lebih cepat adalah kita tidak mengunduh dan membangun semua dependensi setiap saat. Untuk mencapai hal itu kami memastikan ada lapisan dalam proses pembangunan Docker yang mencakup semua dependensi yang sedang dibangun, dan tidak dibangun kembali ketika kami hanya mengubah kode sumber kami.
Inilah Dockerfile yang saya dapatkan:
# 1: Build the exe
FROM rust:1.42 as builder
WORKDIR /usr/src
# 1a: Prepare for static linking
RUN apt-get update && \
apt-get dist-upgrade -y && \
apt-get install -y musl-tools && \
rustup target add x86_64-unknown-linux-musl
# 1b: Download and compile Rust dependencies (and store as a separate Docker layer)
RUN USER=root cargo new myprogram
WORKDIR /usr/src/myprogram
COPY Cargo.toml Cargo.lock ./
RUN cargo install --target x86_64-unknown-linux-musl --path .
# 1c: Build the exe using the actual source code
COPY src ./src
RUN cargo install --target x86_64-unknown-linux-musl --path .
# 2: Copy the exe and extra files ("static") to an empty Docker image
FROM scratch
COPY --from=builder /usr/local/cargo/bin/myprogram .
COPY static .
USER 1000
CMD ["./myprogram"]
Baris FROM rustic:1.42 as build menggunakan fitur Docker yang baru, build multi-tahap – kami membuat satu image Docker (“builder”) hanya untuk membuat kode, lalu menyalin hasil eksekusi ke image Docker akhir.
Untuk memungkinkan kami membangun executable yang berdiri sendiri yang tidak bergantung pada pustaka standar di sistem operasi, kami menggunakan target “musl”, yang dirancang untuk dihubungkan secara statis.
Gambar Docker akhir yang dihasilkan berukuran hampir sama dengan versi rilis program saya, dan versinya cepat, selama saya tidak mengubah dependensi di Cargo.toml.
Beberapa tips lagi untuk mempercepat pembangunan:
- Gunakan file .dockerignore. Ini milikku:
/target/ /.git/
- Gunakan Docker BuildKit, dengan menjalankan build seperti ini:
DOCKER_BUILDKIT=1 docker build .
Berita Terkini
Berita Terbaru
Daftar Terbaru
News
Jasa Impor China
Berita Terbaru
Flash News
RuangJP
Pemilu
Berita Terkini
Prediksi Bola
Technology
Otomotif
Berita Terbaru
Teknologi
Berita terkini
Berita Pemilu
Berita Teknologi
Hiburan
master Slote
Berita Terkini
Pendidikan
Resep
Jasa Backlink
Slot gacor terpercaya
Anime Batch
