Anda harus menambahkan sumber di dalam .bashrc.
Ini berfungsi:
FROM ubuntu:16.04
# Update default packages
RUN apt-get update
# Get Ubuntu packages
RUN apt-get install -y \
build-essential \
curl
# Update new packages
RUN apt-get update
# Get Rust
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
EDIT
Alih-alih
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
Anda dapat menggunakan
ENV PATH="/root/.cargo/bin:${PATH}"
yang merupakan solusi yang kurang bash saja
Satu-satunya source ~/.cargo/env
lakukan adalah
export PATH="$HOME/.cargo/bin:$PATH"
Jadi saran saya adalah mengatur PATH secara eksplisit di Dockerfile Anda:
FROM ubuntu:16.04
# Update default packages
RUN apt-get -qq update
# Get Ubuntu packages
RUN apt-get install -y -q \
build-essential \
curl
# NOTE: no need to run update again at this point
# RUN apt-get update
# Get Rust; NOTE: using sh for better compatibility with other base images
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
# Add .cargo/bin to PATH
ENV PATH="/root/.cargo/bin:${PATH}"
# Check cargo is visible
RUN cargo --help
Ini sedikit lebih transparan daripada source .cargo/env
, dan lebih mudah dipahami jika Anda tidak terbiasa dengan Rust.
Perhatikan juga bahwa ada gambar karat di DockerHub, Anda dapat menggunakannya (dalam FROM
, bukan ubuntu:16.04
) untuk menjalankan atau membuat aplikasi Rust. Ini akan lebih cepat dan lebih mudah daripada menginstal semuanya melalui apt dan curl.
Untuk membuat aplikasi, ada kemungkinan Anda akan menemukan bahwa build docker bertingkat berguna. Mereka cukup fleksibel.
Saya pikir Anda mungkin salah paham apa source
melakukan. Perintah bawaan ini memberi tahu shell saat ini untuk memuat kode berikut (hampir) seolah-olah dijalankan pada prompt saat ini (Anda juga dapat menggunakan sumber di dalam skrip lain). Ini pada dasarnya adalah perintah "sertakan file di sini". Sebagian besar digunakan untuk menyiapkan lingkungan Anda (PATH, LIBPATH, dan fungsi shell lainnya), bukan untuk melakukan pekerjaan nyata.
Menjalankan "sumber" dalam perintah RUN karenanya (hampir selalu) tidak berguna. Itu akan memuat lingkungan kargo dan kemudian keluar, sehingga kehilangan semua perubahan lingkungan.
Ini memberi Anda dua opsi dasar. Salah satunya adalah melakukan seperti yang disarankan michael_bitard, dan menambahkannya ke .bashrc
Anda . Ini berarti bahwa semua perintah selamanya dalam wadah itu (oleh pengguna itu) akan mengatur lingkungan. Jika Anda hanya memerlukan ini untuk penyiapan, maka ini akan mencemari lingkungan shell Anda saat waktu proses.
Opsi kedua pada dasarnya adalah menjalankan sumber sebagai bagian dari setiap perintah RUN yang memerlukannya di seluruh Dockerfile
Anda . RUN bash -c 'source $HOME/.cargo/env; command goes here
Misalnya. Ini lebih berfungsi di setiap baris RUN, tetapi lingkungan akan ada secara eksplisit saat Anda membutuhkannya, dan bukan saat Anda tidak membutuhkannya.
Seringkali , opsi pertama adalah yang Anda inginkan. Jarang Anda ingin yang kedua. Artinya, terkadang Anda hanya memerlukan lingkungan ini untuk tujuan penyiapan, dan Anda tidak ingin lingkungan ini tetap ada - ini jarang terjadi, meskipun skenario itu muncul beberapa kali.