Vous devez ajouter le sourcing dans le .bashrc.
Cela fonctionne :
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
MODIFIER
Au lieu de
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
vous pouvez utiliser
ENV PATH="/root/.cargo/bin:${PATH}"
qui est une solution moins bash uniquement
La seule chose source ~/.cargo/env
fait est
export PATH="$HOME/.cargo/bin:$PATH"
Ma suggestion est donc de définir PATH explicitement dans votre Dockerfile :
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
C'est légèrement plus transparent que source .cargo/env
, et plus facile à comprendre si vous n'êtes pas familier avec Rust.
Notez également qu'il existe des images de rouille sur DockerHub, vous pouvez les utiliser (en FROM
, au lieu de ubuntu:16.04
) pour exécuter ou créer des applications Rust. Ce sera plus rapide et plus facile que de tout installer via apt et curl.
Pour créer des applications, il est possible que vous trouviez utiles les versions de docker en plusieurs étapes. Ils sont assez flexibles.
Je pense que vous ne comprenez peut-être pas ce que source
Est-ce que. Cette commande intégrée indique au shell actuel de charger (presque) le code suivant comme s'il était exécuté à l'invite actuelle (vous pouvez également utiliser source dans d'autres scripts). Il s'agit essentiellement d'une commande "inclure le fichier ici". Il est principalement utilisé pour configurer votre environnement (PATH, LIBPATH et d'autres fonctions du shell), pas pour faire un vrai travail.
Exécuter "source" dans une commande RUN est donc (presque toujours) inutile. Il chargera l'environnement de fret puis sortira, perdant ainsi tous les changements d'environnement.
Cela vous laisse avec deux options de base. La première consiste à faire ce que suggère michael_bitard et à l'ajouter à votre .bashrc
. Cela signifie que toutes les commandes pour toujours dans ce conteneur (par cet utilisateur) auront l'environnement configuré. Si vous n'en avez besoin que pour l'installation, cela pollue votre environnement shell lors de l'exécution.
La deuxième option consiste essentiellement à exécuter la source dans le cadre de chaque commande RUN qui en a besoin dans le reste de votre Dockerfile
. RUN bash -c 'source $HOME/.cargo/env; command goes here
par exemple. C'est plus de travail sur chaque ligne RUN, mais l'environnement sera explicitement là quand vous en aurez besoin, et pas quand vous n'en aurez pas besoin.
La plupart du temps , la première option est ce que vous voulez. Rarement vous voulez le deuxième. C'est-à-dire que parfois vous n'avez besoin de cet environnement qu'à des fins de configuration, et vous ne voulez pas qu'il persiste - c'est rare, même si ce scénario s'est produit plusieurs fois.