GNU/Linux >> Tutoriels Linux >  >> Linux

Lors de l'installation de la chaîne d'outils Rust dans Docker, la commande Bash `source` ne fonctionne pas

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.


Linux
  1. Pourquoi la saisie semi-automatique ne fonctionne-t-elle pas lors de la saisie d'un nom de commande après `source` ?

  2. La commande Rm dans le script Bash ne fonctionne pas avec la variable ?

  3. Comment faire fonctionner la commande alias dans un script bash ou un fichier bashrc

  4. arguments de ligne de commande pour l'exécution de docker

  5. Exécutez la commande bash sur le pipeline jenkins

Commande d'attente bash

Commande Bash printf

Ré-exécutez continuellement une commande lorsqu'elle se termine dans Bash

Problème(s) d'expression régulière dans Bash :[^negate] ne semble pas fonctionner

Exécuter une commande lorsque le système est inactif et lorsqu'il est à nouveau actif

Exécuter la commande dans bash sans enregistrer dans l'historique