Mejores prácticas para escribir Dockerfile

1. Reducir la capa de espejo

Un comando EJECUTAR forma una nueva capa, intente escribir comandos de Shell en una línea para reducir la capa de espejo.
P.ej:

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y 
RUN yum install -y gcc gcc-c++ make -y
RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz
RUN tar zxf php-5.6.36.tar.gz
RUN cd php-5.6.36
RUN ./configure --prefix=/usr/local/php 
RUN make -j 4 
RUN make install
EXPOSE 9000
CMD ["php-fpm"]

Debe escribirse como:

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php \
    make -j 4 && make install
EXPOSE 9000
CMD ["php-fpm"]

Resultado: piso 12 -> piso 6

2. Optimiza el tamaño de la imagen: limpia los datos inútiles

Una EJECUCIÓN forma una nueva capa. Si no se elimina en la misma capa, no importa si el archivo se eliminó en último lugar, se llevará a la siguiente capa. Por lo tanto, los datos residuales correspondientes deben limpiarse en cada capa para reducir el tamaño de la imagen.

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel \
    libmcrypt-devel libxslt-devel libtidy-devel autoconf \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php \
    make -j 4 && make install && \
    cd / && rm -rf php*

Se pueden salvar al menos decenas de M, o incluso cientos de M.

3. Reducir el tiempo de transmisión de la red

Es mejor tener un lugar para almacenar el paquete de software en su interior, similar a la dirección de descarga de PHP oficial mencionada anteriormente: http://docs.php.net/distributions/php-5.6.36.tar.gz, si usa maven para construya esto La operación también se cambia a un almacén privado de maven para reducir el tiempo de transmisión de la red y aumentar la velocidad de construcción de la imagen .

4. Construcción de imágenes en varias etapas

  • Si ejecuta un proyecto, de acuerdo con nuestro enfoque anterior, copie el código directamente en la imagen base. ¿Qué pasa si es un proyecto que requiere una compilación de código previo? Por ejemplo, en lenguaje JAVA, ¡cómo compilar e implementar el código juntos para completarlo!

  • El método anterior necesita construir una imagen básica en un Dockerfile de antemano, incluido el entorno de ejecución del proyecto y las bibliotecas dependientes, y luego escribir un Dockerfile para copiar el proyecto en el entorno de ejecución, que es un poco más complicado.

    Para lenguajes como JAVA, si el código está compilado en un Dockerfile, el código fuente debe estar integrado, pero solo se necesita el paquete construido durante la operación real. Este tipo de código fuente introducido tiene un cierto riesgo de seguridad, y también agrega un volumen de imagen reflejada.
    Para resolver los problemas anteriores, Docker 17.05 comenzó a admitir compilaciones de varias etapas (compilaciones de varias etapas), lo que puede simplificar el Dockerfile y reducir el tamaño de la imagen.

Por ejemplo, para construir un espejo de proyecto JAVA:
encontré un proyecto de blog JAVA en github como demostración:

# git clone https://github.com/b3log/solo.git
# cd solo
# vi Dockerfile
FROM maven AS build
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package

FROM tomcat-85
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh", "run"]
# docker container run -d -v /usr/local/jdk1.8:/usr/local/jdk solo:v1

En primer lugar, hay una palabra clave AS después de la primera FROM, que puede dar un nombre a esta etapa.
Luego, la segunda parte de FROM usa la imagen de Tomcat que creamos anteriormente, y la palabra clave COPY agrega el parámetro -from, que se usa para copiar archivos de una etapa determinada a la etapa actual. Este Dockerfile está listo.

Resumen: las imágenes pequeñas tienen muchos beneficios, como una implementación rápida y una reversión rápida. El tiempo de interrupción del servicio se reduce y el almacén espejo ocupa menos espacio en disco.

Supongo que te gusta

Origin blog.51cto.com/15127501/2657002
Recomendado
Clasificación