Vamos a tener un Dockerfile

FROM python:3
ADD script.py /
CMD [ "python", "script.py" ]

Script.py imprime sin fin algunos registros en la salida.

Me gustaría ejecutar un contenedor creado a partir de este Dockerfile que imprimirá los registros en la salida y eliminará script.py en este contenedor AUTOMÁTICAMENTE.

Por ejemplo, puedo cambiar un Dockerfile o puedo cambiar las opciones del comando 'docker run'

Intenté algo como:

docker run -it my_image /bin/bash -c "python /script.py; rm /script.py"

Pero no tuve éxito. También intenté mover dos instrucciones a CMD, pero tampoco fue exitoso

1
GolovDanil 27 abr. 2020 a las 16:20

3 respuestas

La mejor respuesta

Si entiendo correctamente, desea proporcionar una imagen de Docker sin la fuente de un script de Python, pero aún así puede ejecutar ese script de Python.

Puede hacerlo con 2 características relevantes:

  • Python puede compilar archivos .py en archivos .pyc (que son básicamente archivos python previamente analizados, no son código nativo).
  • Docker puede usar varias imágenes durante el proceso de compilación para permitir imágenes que no contengan el "historial" completo de la compilación.

Suponiendo un script de Python llamado hello.py puede hacer algo como esto Dockerfile:

FROM python:3 as build
ADD hello.py /
RUN [ "python", "-m", "compileall", "-l", "-b", "."]

FROM python:3 as release
COPY --from=build /hello.pyc /
CMD [ "python", "hello.pyc" ]
1
Joachim Sauer 27 abr. 2020 a las 15:01

Este es el propósito detrás de las compilaciones de varias etapas. Puede construir su aplicación, o en su caso, su archivo de salida, en una etapa. Luego copie el artefacto resultante a una etapa posterior con una imagen base mínima. P.ej.

FROM python:3 as build
ADD script.py /
RUN [ "python", "script.py" ]

FROM minimal_base_image as release
COPY --from=build /script.out /

Tenga en cuenta que esto no se ve en lenguajes interpretados como python muy a menudo, ya que el propósito de enviar una imagen generalmente es enviar la aplicación, no el resultado de la aplicación, y necesita el tiempo de ejecución de python para ejecutar un script de python.

1
BMitch 27 abr. 2020 a las 14:42

Puede agregar una línea al final del script para eliminarse.

rm -- "$0"

Referencia

0
Brand 27 abr. 2020 a las 13:41