Entrada de Docker al combate real (4)

Construcción en varias etapas de volúmenes de imágenes comprimidos

El tamaño de la imagen oficial de Python utilizada anteriormente es de 882 MB completos. Sobre esta base, se instala la biblioteca de terceros utilizada y se agregan los recursos, como las imágenes requeridas por el proyecto. El tamaño puede superar fácilmente 1 G. Tal imagen grande, la transmisión por red es muy inconveniente para los clientes, por lo tanto, reducir el tamaño de la imagen es un trabajo muy necesario.

Hay una imagen python:3.8-alpine en docker hub, el tamaño es de solo 44.5 MB. La razón por la que es pequeño es que alpine es un sistema operativo que usa la arquitectura busybox, que generalmente se usa para aplicaciones integradas. Traté de usar este espejo y descubrí que está bien instalar bibliotecas generales, pero si quiero instalar numpy, etc., será difícil y ni siquiera puedo encontrar una solución en Internet.

Aún así, regrese a la ruta básica, la imagen del sistema operativo principal, el tamaño de ubuntu es de 72.9 MB y el tamaño de centos es de 209 MB; ¡esta también es una razón importante por la que prefiero usar ubuntu! Usando ubuntu como imagen base, el tamaño después de instalar python es de 139 MB, y el tamaño después de instalar pip aumenta repentinamente a 407 MB. Si instala algo más, alcanzará o superará fácilmente el tamaño de la imagen oficial de python.

Parece que es difícil comprimir el tamaño del archivo de imagen por la ruta habitual. Afortunadamente, todavía hay una forma de salvar al país con una curva, que es el método de construcción de varias etapas.

La idea de la construcción en varias etapas es realmente muy simple: primero construya una imagen grande y completa, y luego solo saque la parte útil de la imagen y póngala en una nueva imagen. En nuestro escenario, pip solo se necesita durante el proceso de construcción de la imagen, pero no es útil para ejecutar nuestro programa. Solo necesitamos instalar pip, luego usar pip para instalar la biblioteca de terceros y luego copiar la biblioteca de terceros de este espejo a un espejo con solo python y sin pip, para que se pueda guardar el espacio de 268 MB ocupado por pip .

1. Instale python sobre la base de la imagen de ubuntu:

FROM ubuntu
RUN apt update \
    && apt install python3

Entonces corre:

docker build -t python:3.8-ubuntu .

De esta forma se genera la imagen python:3.8-ubuntu.

2. Instale pip sobre la base de python:3.8-ubuntu:

FROM python:3.8-ubuntu
RUN apt install pip

Entonces corre:

docker build -t python:3.8-ubuntu-pip .

De esta forma se genera la imagen python:3.8-ubuntu-pip.

3. Imagen de destino de compilación de varias etapas:

FROM python:3.8-ubuntu-pip
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
FROM python:3.8-ubuntu
COPY --from=0 /usr/local/lib/python3.8/dist-packages/ /usr/local/lib/python3.8/dist-packages/

Este dockerfile debe explicarse porque tiene dos comandos FROM.

El primero se basa en la imagen python:3.8-ubuntu-pip e instala numpy Por supuesto, en aplicaciones prácticas, escriba todas las bibliotecas de terceros utilizadas aquí.

El segundo FROM se basa en la imagen FROM python:3.8-ubuntu, y todas las bibliotecas de terceros se copian. El –from=0 después del comando COPY significa copiar desde la etapa 0. En la aplicación real, copie el código del programa del contexto, agregue el PUNTO DE ENTRADA requerido, etc.

Finalmente, ejecute de nuevo:

docker build -t project:1.0 .

Por supuesto, la imagen de nuestro proyecto está lista. Alrededor de 750 MB más pequeño que la versión creada con el espejo oficial de Python.

Importar la imagen al entorno de producción

En este punto, nuestra imagen ha sido creada, pero ¿dónde está el archivo de imagen y cómo ejecutarlo en el entorno de producción? Cuando usé el comando de imágenes de la ventana acoplable hace un momento, vi la imagen generada:

$ docker images                          
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello               1.0                 01fe19111dc7        59 minutes ago      893MB
python              3.8                 f5041c8ae6b1        13 days ago         884MB
ubuntu              20.04               f643c72bc252        5 weeks ago         72.9MB
hello-world         latest              bf756fb1ae65        12 months ago       13.3kB

Podemos usar el comando docker save para guardar la imagen en un archivo específico, y el archivo guardado es un archivo comprimido en formato .tar:

docker save -o hello.tar hello:1.0

Copie hello.tar a la máquina en el entorno de producción y luego ejecute el comando de importación:

docker load -i hello.tar

Está listo para usar.

 

Supongo que te gusta

Origin blog.csdn.net/qq_28165595/article/details/131878251
Recomendado
Clasificación