GNU/Linux >> Belajar Linux >  >> Linux

Saat menginstal Rust toolchain di Docker, perintah Bash `source` tidak berfungsi

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.


Linux
  1. Mengapa Pelengkapan Otomatis Tidak Berfungsi Saat Mengetik Nama Perintah Setelah `sumber`?

  2. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  3. Cara Menjalankan Perintah di Running Docker Container

  1. argumen baris perintah untuk menjalankan docker

  2. Mengapa Bash `(())` tidak berfungsi di dalam `[[]]`?

  3. Jalankan perintah saat sistem dalam keadaan diam dan saat aktif kembali

  1. [Memperbaiki] bash:Sudo:perintah tidak ditemukan

  2. chroot gagal - tidak dapat menjalankan perintah `/ bin/bash':Tidak ada file atau direktori tersebut

  3. Bagaimana cara menjalankan perintah berkali-kali, menggunakan bash Shell?