Usuario:ManuelRomero/Docker/dockerFile
De WikiEducator
|
Contenido
DokerFile
- Es un fichero de texto que va contener una serie de instrucciones a partir de las cuales vamos a crear una imagen.
- El fichero tiene un formato concreto, con una serie de instrucciones que veremos a continuación. Al menos es necesario utilizar la instrucción FROM para especificar la imagen base a partir de la cual queremos construir nuestra imagen personalizada, que es el objetivo de la especificación de este fichero
(: La idea es que partiendo de una imagen, personalicemos la imagen que queremos crear, después, a partir de esta imagen, levantaremos el contenedor)
- Una vez que tengamos el contenido del fichero construiremos la imagen a través del comando docker build [opciones] PATH|URK|-
- En el fichero se pueden colocar comentarios que ayudarán a su compresiòn
#Ahora especificaremos la imagen en la que nos vamos a basar
FROM ubuntu:latest
- El nombre del fichero
- El nombre del fichero puede ser cualquiera, pero se recomienda que sea DockerFile, En caso de que se establezca otro nombre, habrá que especificarlo cuando se invoque a la instrucción build
docker build -f nombre_fichero .
Instrucciones
FROM: Establece la imagen base a partir de la cual se va a construir la imagen personalizada. RUN: Ejecuta un comando en la imagen durante la construcción. CMD: Especifica el comando predeterminado que se ejecutará cuando se inicie un contenedor a partir de la imagen. LABEL: Añade metadatos a la imagen. EXPOSE: Especifica un puerto o puertos que deben abrirse en el contenedor cuando se ejecuta. ENV: Establece una variable de entorno en la imagen. ADD: Copia archivos desde el host a la imagen. COPY: Copia archivos desde el contexto de construcción a la imagen. ENTRYPOINT: Especifica el programa que se ejecutará cuando se inicie un contenedor a partir de la imagen. VOLUME: Crea un punto de montaje en el contenedor. USER: Especifica el usuario o el grupo de usuarios que se utilizarán para ejecutar los comandos en el contenedor. WORKDIR: Establece el directorio de trabajo predeterminado para los comandos RUN, CMD, ENTRYPOINT, COPY y ADD. ARG: Declara un argumento que puede pasarse a la imagen durante la construcción con el parámetro --build-arg.
FROM
- Establece la imagen a partir de la cual partimos. Si por ejemplo, nuestro contenedor va a ejectuar un servidor web, deberíamos de partir de una imagen ngynx o http. conviene buscar la imagen de la que partamos en docker hub
FROM ubuntu:latest
- Esta instrucción es obligatoria y debe de ser la primera
- Si creamos la imagen a partir de este fichero de especificación, crearemos una imagen a partir de ubuntu:latest. Para ejecutar las instrucciones del fichero docker file usamos el comando build como se ha comentado anteriormente
- Una vez que establecemos la imagen a partir de la cual queremos partir, con las instrucciones siguiente vamos a personalizar nuestra imagen.
RUN
- Esta es una instrucción muy importante y muy utilizada. Con ella vamos a poder ejectutar acciones o instrucciones en la imagen durante su construcción.
- Suele ir despés del FROM, y es muy frecuente que aparezcan varias instrucciones de este tipo.
- Es importante tener en cuenta que durante la construcción de la imagen, es posible que no se pueda interactuar mediante el teclado, por lo que si la acción requiere que facilitemos algún valor o seleccionemos alguna opción, hay que preverlo y establecerlo previamente.
- Podremos ejecutar cualquier comando, siendo habituales:
- 1.-Instalar paquetes
RUN apt-get update && apt-get install -y \ git \ zip \ php
Se podrían poner varias instrucciones RUM como se muestra a continuación, pero es mucho menos eficitente y tardaría más tiempo. Se separan por espacios:
RUN apt-get update RUN apt-get install -y git RUN apt-get install -y zip RUN apt-get install -y php
- Ejecutar script, previamente creados
RUN bash nombre_scrip.sh
- Ejecutar comandos de administración
RUN mkdir -p /var/www/app && chown -R www-data:www-data /var/www/app
- Ejecutar comandos de instalación de paquetes específicos (p.e. de php con composer)
RUN composer install --no-scripts --no-autoloader
- Para evitar que las diferentes instrucciones soliciten información durante el proceso de ejecución podemos:
- 1.- ;Establecer una variable de entorno que especifique que no queremos interactuar
ENV DEBIAN_FRONTEND noninteractive
- 2.-;Opción --non-interactive del comando apt-get
puedes utilizar la esta opción en el comando concreto para evitar que nos hagan preguntas
- 3.-:Opciones para forzar que no haya preguntas o que responda una valor por defecto
Utilizar otras opciones del comando apt-get, como --force-confdef,--force-confold o --force-yes, para forzar la instalación de los paquetes sin mostrar mensajes o preguntas al usuario.
- 4.-;Establecer el valor de la variable esperado.
- Por ejemplo en la instalación de php, nos pide que establezcamos la zona horario, la podrías establecer previamente en este caso usando la variable --timezone
RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests --timezone Europe/Madrid php
COPY
- Con esta instrucción copiamos ficheros del host a la imagen.
- Esta instrucción es útil para incluir archivos necesarios para la aplicación en la imagen, como archivos de configuración o scripts de inicio.
- EL comando es igual que lo usamos en el terminal
COPY archivo.txt /ruta/en/la/imagen/ #Copiar un directorio completo a la imagen: COPY directorio/ /ruta/en/la/imagen/ #Copiar un archivo desde una URL a la imagen: COPY http://ejemplo.com/archivo.zip /ruta/en/la/imagen/ #Copiar un archivo desde una URL y darle un nombre diferente: COPY http://ejemplo.com/archivo.zip /ruta/en/la/imagen/nuevo_nombre.zip
CMD
- Sirve para especificar el comando o comandos que queremos ejecutar cuando se inicia el contenedor
- Este comando/s serán sustituidos si se especifican en la creación o ejecución del contenedor mediante el comando docker run
LABEL
EXPOSE
ENV
- Establece una variable de entorno en el contenedor
- Por ejemplo si quiero poner una variable de entorno
ENV APP_ENV production
- Otro uso importante es para impedir que en la instalación de paquetes, cuando se genera la imagen, que no se establezca interacción con la variable de entorno DEBIAN_FRONTEND
ENV DEBIAN_FRONTEND noninteractive