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
3 respuestas
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" ]
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.
Puede agregar una línea al final del script para eliminarse.
rm -- "$0"
Nuevas preguntas
docker
Docker es una herramienta para construir y ejecutar contenedores. Se aceptan preguntas sobre Dockerfiles, operaciones y arquitectura. Las preguntas sobre cómo ejecutar Docker en producción pueden encontrar mejores respuestas en ServerFault (https://serverfault.com/). La etiqueta docker rara vez se usa sola y a menudo se combina con otras etiquetas como docker-compose y kubernetes.