GNU/Linux >> Tutoriales Linux >  >> Linux

Al instalar la cadena de herramientas Rust en Docker, el comando Bash `source` no funciona

Tienes que agregar el abastecimiento dentro del .bashrc.

Esto funciona:

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

EDITAR

En lugar de

RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc

puedes usar

ENV PATH="/root/.cargo/bin:${PATH}"

que es una solución menos bash


Lo único source ~/.cargo/env hace es

export PATH="$HOME/.cargo/bin:$PATH"

Entonces, mi sugerencia es establecer PATH explícitamente en su 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

Esto es un poco más transparente que source .cargo/env y más fácil de comprender si no está familiarizado con Rust.

Además, tenga en cuenta que hay imágenes oxidadas en DockerHub, puede usarlas (en FROM , en lugar de ubuntu:16.04 ) para ejecutar o crear aplicaciones de Rust. Será más rápido y más fácil que instalar todo a través de apt y curl.

Para crear aplicaciones, existe la posibilidad de que encuentre útiles las compilaciones de ventanas acoplables de varias etapas. Son bastante flexibles.


Creo que puede estar malinterpretando lo que source lo hace. Este comando incorporado le dice al shell actual que cargue el siguiente código (casi) como si se estuviera ejecutando en el indicador actual (también puede usar la fuente dentro de otras secuencias de comandos). Es básicamente un comando "incluir archivo aquí". Se usa principalmente para configurar su entorno (RUTA, LIBPATH y otras funciones de shell), no para hacer un trabajo real.

Ejecutar "fuente" en un comando EJECUTAR es (casi siempre) inútil. Cargará el entorno de carga y luego saldrá, perdiendo así todos los cambios del entorno.

Esto te deja con dos opciones básicas. Una es hacer lo que sugiere michael_bitard y agregarlo a su .bashrc . Esto significará que todos los comandos forevermore en ese contenedor (por ese usuario) tendrán el entorno configurado. Si solo necesita esto para la configuración, entonces contamina su entorno de shell en tiempo de ejecución.

La segunda opción es básicamente ejecutar el código fuente como parte de cada comando EJECUTAR que lo necesite en el resto de su Dockerfile . RUN bash -c 'source $HOME/.cargo/env; command goes here por ejemplo. Esto es más trabajo en cada línea RUN, pero el entorno estará explícitamente allí cuando lo necesites y no cuando no lo necesites.

La mayor parte del tiempo , la primera opción es lo que quieres. Rara vez quieres el segundo. Es decir, a veces solo necesita este entorno para fines de configuración y no quiere que persista; esto es raro, aunque me ha surgido ese escenario varias veces.


Linux
  1. ¿Por qué no funciona el autocompletado cuando se escribe un nombre de comando después de `fuente`?

  2. Cómo ejecutar un comando en un contenedor Docker en ejecución

  3. bash no carga el nodo en el comando ssh remoto

  4. La instalación de Docker en Linux Mint 19.2 no funciona

  5. Vuelva a ejecutar continuamente un comando cuando finalice en Bash

Comando de espera bash

Comando Bash printf

¿Por qué Bash `(())` no funciona dentro de `[[]]`?

¿Cómo guardar + cerrar archivo al editar en bash?

Problema(s) de expresiones regulares en Bash:[^negate] no parece funcionar

¿Cómo ejecutar un comando varias veces, usando bash shell?