Pasar un archivo como argumento a un contenedor Docker

4 minutos de lectura

avatar de usuario de mpp
mpp

Un programa de Python muy simple. Supongamos que el directorio actual es /PYTHON. quiero pasar archivo.txt como un argumento para el script de Python boot.py. Aquí está mi Dockerfile:

FROM python
COPY boot.py ./
COPY file.txt ./
RUN pip install numpy
CMD ["python", "boot.py", "file.txt"]

Luego construyo el contenedor Docker con:

docker build -t boot/latest .

Luego ejecuta el contenedor

docker run -t boot:latest python boot.py file.txt

Obtuve los resultados correctos.

Pero si copio otro archivo, file1.txt, al directorio actual (desde un directorio diferente (no /PYTHON)), entonces ejecuto el contenedor nuevamente:

docker run -t boot:latest python boot.py file1.txt

Tuve el siguiente error:

Error de archivo no encontrado: [Errno 2] No existe tal archivo o directorio: ‘file1.txt’

por lo que el error se debe al hecho de que archivo1.txt no está en el contenedor, pero si comparto este contenedor con un amigo y el amigo quiere pasar un archivo muy diferente como argumento, ¿cómo escribo el Dockerfile para que cualquier persona con mi contenedor pueda pasar archivos muy diferentes como argumento sin errores?

  • Debe cambiar su Dockerfile de acuerdo con el archivo que está pasando … si está trabajando con file.txt y no funciona con file1.txt, mire dentro del Dockerfile, ¿hay file1.txt allí?

    – Oscar Aka Elvis

    12 de diciembre de 2016 a las 0:14


  • El file1.txt no está en Dockerfile porque no sé qué archivos se pasarán como argumento por adelantado.

    – mpp

    12 de diciembre de 2016 a las 0:20

  • Archivado github.com/docker/cli/issues/3046 para simplificar el paso de archivos a ‘docker run’

    – rublo

    9 abr 2021 a las 21:47


Avatar de usuario de HakRo
hakro

No funcionará de esa manera. Como dijiste, file1.txt no está en el contenedor.

La solución es usar volúmenes de Docker para inyectar archivos desde su máquina host al contenedor cuando lo ejecuta.

Algo como esto:

docker run -v /local/path/to/file1.txt:/container/path/to/file1.txt -t boot:latest python boot.py /container/path/to/file1.txt

Después /local/path/to/file1.txt sería la ruta en su máquina host que anulará /container/path/to/file1.txt en el contenedor

  • Asegúrese de que la ruta local sea una ruta absoluta; no puede especificar una ruta relativa como ./myfile.txt1.

    – alanc10n

    2 jun a las 17:36

Avatar de usuario de Nick Roz
Nick Roz

También puede hacer que su script se lea desde STDIN y luego pasar datos a la ventana acoplable usando cat. ¿Eche un vistazo a cómo hacer que el contenedor docker lea desde stdin?

El truco es mantener STDIN abierto incluso si no está conectado con
--interactive o -i (alias) opción para Docker.

Algo como:

cat /path/to/file | docker run -i --rm boot python boot.py

O:

docker run -i --rm boot python booty.py < /path/to/file

EOF es el final de la entrada.

  • no necesitas cat para eso. Hacer docker run -i --rm boot python boot.py < /path/to/file.

    – Paweł Bylica

    8 de agosto de 2020 a las 10:38

  • en las ventanas cmddónde cat normalmente no está disponible, también puede utilizar < como sugirió @PawełBylica.

    – Christopher K.

    8 dic 2021 a las 15:43

Avatar de usuario de JustDanyul
solodanyul

Si entiendo la pregunta correctamente, está reconociendo que el archivo no está en el contenedor y está preguntando cómo compartir mejor su contenedor con el mundo, permitiendo que las personas agreguen su propio contenido.

Tienes un par de opciones, ya sea usar Volúmenes acoplables, que permite a sus amigos (y otras partes interesadas) montar volúmenes locales dentro de sus contenedores Docker. Es decir, puede superponer una carpeta en su sistema de archivos local en una carpeta dentro del contenedor (esto generalmente es bastante ingenioso cuando también está desarrollando localmente).

O, nuevamente, dependiendo del propósito de su contenedor, alguien podría ampliar su imagen. Por ejemplo, un Dockerfile como

FROM yourdockerimage:latest
COPY file1.txt ./
CMD ["python", "boot.py", "file1.txt"]

Elija la opción que mejor se adapte a su proyecto.

Una opción es hacer uso de volúmenes.

De esta manera, todos los colaboradores del proyecto pueden montarlos en los contenedores.

avatar de usuario de gdzcorp
gdzcorp

Puede cambiar su Dockerfile a:

FROM python
COPY boot.py ./
COPY file.txt ./
RUN pip install numpy
ENTRYPOINT ["python", "boot.py"]

Y luego ejecutarlo para leer desde STDIN:

docker run -i boot:latest -<file1.txt

¿Ha sido útil esta solución?