Diferències
Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
| info:libros:docker-sec-dev-ops:cap2 [29/01/2019 00:59] – [.dockerignore] mate | info:libros:docker-sec-dev-ops:cap2 [31/01/2019 00:44] (actual) – [ARG] mate | ||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| - | = Capítulo 2 (Docker SecDevOps) | + | = [Docker SecDevOps] Capítulo 2 : Dockerfile |
| - | == Dockerfile | + | |
| * ''#'' | * ''#'' | ||
| * '' | * '' | ||
| * primera instrucción: | * primera instrucción: | ||
| - | === directivas | + | == build |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | == directivas | ||
| * antes de la instrucción **FROM** | * antes de la instrucción **FROM** | ||
| * no repeticiones | * no repeticiones | ||
| Línia 12: | Línia 16: | ||
| * **escape** : caracter de escape en ficheros Dockerfile. Soporta %%\%% y %%`%% | * **escape** : caracter de escape en ficheros Dockerfile. Soporta %%\%% y %%`%% | ||
| - | === variables de entorno | + | == ENV |
| - | * **ENV** | + | * variables de entorno |
| * '' | * '' | ||
| - | * '' | + | * '' |
| + | * '' | ||
| * se referencian con el signo **$** o **${}** | * se referencian con el signo **$** o **${}** | ||
| * funcionalidades tipo bash: | * funcionalidades tipo bash: | ||
| Línia 32: | Línia 37: | ||
| * VOLUME | * VOLUME | ||
| * WORKDIR | * WORKDIR | ||
| + | * son de tipo global (afecta a todas las imágenes que desciendan donde fueron definidas) | ||
| + | * también llegan al contenedor | ||
| + | * se pueden sobrescribir con el parámetro **--env** en **docker run** | ||
| - | === .dockerignore | + | == .dockerignore |
| * se procesa al mismo tiempo que se procesa el contexto en el **build** de una imagen | * se procesa al mismo tiempo que se procesa el contexto en el **build** de una imagen | ||
| * ignora todos los archivos / directorios que estén especificados | * ignora todos los archivos / directorios que estén especificados | ||
| Línia 49: | Línia 57: | ||
| * se puede excluir // | * se puede excluir // | ||
| - | === FROM | + | == FROM |
| * '' | * '' | ||
| + | * si no se especifica //tag// se usará **latest** | ||
| + | * el digest es el SHA256 de la imagen: '' | ||
| + | * primera instrucción del // | ||
| + | |||
| + | === multistage | ||
| + | uso de más de una imagen Docker para realizar la tarea | ||
| + | * uso de 2 o más FROM en el Dockerfile | ||
| + | * la imagen del último FROM es la que prevalece, todas las anteriores son descartadas | ||
| + | * es posible " | ||
| + | * '' | ||
| + | * 0 haría referencia a la primera imagen usada, también se puede hacer referencia a través del nombre asignado en **AS** | ||
| + | |||
| + | == RUN | ||
| + | ejecución de comandos en la imagen que estamos construyendo | ||
| + | * '' | ||
| + | * linux: /bin/sh -c | ||
| + | * windows: cmd /s /c | ||
| + | * '' | ||
| + | * no se ejecuta shell (o para cambiar la shell o entornos sin shell) | ||
| + | * vector JSON (comillas obligatorias) | ||
| + | * cada RUN genera una layer(capa) | ||
| + | * uso de %%|%% (pipe) para redirigir la salida de un ejecutable a otro | ||
| + | * tener en cuenta que si falla la ejecución del primero, pero no del segundo, la ejecución se dará por buena | ||
| + | * se puede usar '' | ||
| + | * '' | ||
| + | |||
| + | == CMD | ||
| + | ejecución en tiempo de creación del container | ||
| + | * proveer de valores por defecto | ||
| + | * los parámetros se pasarían a ENTRYPOINT | ||
| + | * entre esos valores se puede incluir un ejecutable | ||
| + | * 3 formas: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * para asegurarse la ejecución de un programa hay que combinar ENTRYPOINT con CMD | ||
| + | * si se pasan parámetros en el **docker run**, estos sobreescriben los especifiados en el CMD | ||
| + | |||
| + | == ENTRYPOINT | ||
| + | es el comando recomendable para definir el comando principal de una imagen | ||
| + | * 2 formas: | ||
| + | * ENTRYPOINT [" | ||
| + | * ENTRYPOINT comando param1 param2 <- comando ejecutado a través de la shell | ||
| + | * es posible sobrescribir el ENTRYPOINT de una imagen a través del parámetro **%%--%%entrypoint** en **docker run** | ||
| + | * '' | ||
| + | * -al y /root son parámetros pasados al nuevo **entrypoint** | ||
| + | * importante que la última instrucción ejecutada por el ENTRYPOINT se convierta en en el proceso con PID 1 del contenedor (a través de la instrucción **exec**) para que reciba las señales Unix enviadas al contenedor.< | ||
| + | #!/bin/bash | ||
| + | set -e | ||
| + | if [ " | ||
| + | chown -R postgres " | ||
| + | if [ -z "$(ls -A " | ||
| + | gosu postgres initdb | ||
| + | fi | ||
| + | exec gosu postgres " | ||
| + | fi | ||
| + | exec " | ||
| + | |||
| + | * como regla general, debemos tener en cuenta: | ||
| + | * cada Dockerfile debe tener definido un CMD o ENTRYPOINT | ||
| + | * cuando queremos usar un contenedor como un fichero ejecutable, debemos usar ENTRYPOINT | ||
| + | * CMD se debería usar para definir los parámetros por defecto para ENTRYPOINT o para ejecutar un comando de apoyo para la creación del contenedor, pero no el comando que ejecuta el proceso final del mismo | ||
| + | |||
| + | == LABEL | ||
| + | añade metadatos a una imagen | ||
| + | * '' | ||
| + | * se pueden crear varias etiquetas o una única separando valores | ||
| + | * etiquetas con el mismo nombre, prevalece la última | ||
| + | |||
| + | == EXPOSE | ||
| + | indica puertos y protocolos donde escuchará el contenedor | ||
| + | * con **docker run** podemos mapear los puertos con: | ||
| + | * '' | ||
| + | * '' | ||
| + | * los contenedores que comparten red, no necesitan mapear puertos, tienen acceso a todos ellos. | ||
| + | |||
| + | == ADD | ||
| + | copia ficheros, directorios o ficheros remotos al directorio de destino en la imagen docker | ||
| + | * '' | ||
| + | * '' | ||
| + | * origen puede ser absoluto o relativo al contexto | ||
| + | * si es un directorio, copiará el contenido | ||
| + | * destino puede ser absoluto o relativo al WORKDIR | ||
| + | * si acaba en **%%/%%** copia el fichero origen con el mismo nombre | ||
| + | * origen permite caracteres comodín usando las reglas de filepath.Match del lenguaje Go: **%%*%%**, **%%?%%** | ||
| + | * si origen está en un formato de compresión reconocido (gzip, | ||
| + | * si origen es una URL a un archivo comprimido, no se descomprime, | ||
| + | * si se especifican múltiples orígenes o comodines, destino ha de ser directorio (y acabar en /) | ||
| + | * si destino no existe, se creará, con los directorios intermedios necesarios | ||
| + | * todos los ficheros y directorios serán creados con UID/GID 0 | ||
| + | * en caso de URLs a ficheros remotos, los permisos se establecen a 600 | ||
| + | * ADD no tiene sistema de autentificación implementado, | ||
| + | |||
| + | == COPY | ||
| + | copiar ficheros y directorios | ||
| + | * '' | ||
| + | * '' | ||
| + | * NO descomprime archivos | ||
| + | * NO copia ficheros remotos | ||
| + | * Permite copiar ficheros entre imágenes ([[info: | ||
| + | * '' | ||
| + | |||
| + | == VOLUME | ||
| + | crea un punto de montaje con el nombre dado | ||
| + | * '' | ||
| + | * '' | ||
| + | * Los volúmenes se montan en tiempo de ejecución del contenedor | ||
| + | * en ese momento se le puede indicar a Docker donde montarlo: | ||
| + | * con el parámetro '' | ||
| + | * sin parámetro, ubica el volumen en **/ | ||
| + | * para averiguar el nombre del volumen asociado:< | ||
| + | * en mac, el punto de montaje no está en la máquina Apple, si no en el sistema de ficheros de la máquina virtual que Docker usa por debajo | ||
| + | |||
| + | == USER | ||
| + | establece el usuario (UID) y grupo (GID) del usuario que ejecuta los comandos de las instrucciones **RUN**, **CMD**, **ENTRYPOINT** | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * por defecto se ejecutan como **root** | ||
| + | * se puede usar más de una vez en el mismo **Dockerfile**, | ||
| + | * también se puede usar **sudo**, aunque se desaconseja su uso (por temas relacionados con el envío de señales y la emulación de termianles) -> recomendado **gosu** | ||
| + | * también se puede especificar el usuario en el momento de ejecución del contenedor con el parámetro '' | ||
| + | |||
| + | == WORKDIR | ||
| + | establece el directorio de trabajo para los comandos **RUN**, **CMD**, **ENTRYPOINT**, | ||
| + | * '' | ||
| + | * el directorio es creado inmediatemente | ||
| + | * pueden ser absolutos (recomendado) o relativos (al último **WORKDIR**) | ||
| + | |||
| + | == ARG | ||
| + | variables que el usuario puede usar durante el **build** de la imagen | ||
| + | * '' | ||
| + | * también se pueden pasar como parámetro en **docker build** con '' | ||
| + | * solo sobreviven //en la fase// en las que son definidas | ||
| + | * ENV tiene preferencia sobre ARG | ||
| + | * existe un conjunto de variables definidas: | ||
| + | * HTTP_PROXY, http_proxy | ||
| + | * HTTPS_PROXY, | ||
| + | * FTP_PROXY, ftp_proxy | ||
| + | * NO_PROXY, no_proxy | ||
| + | * que tienen las siguientes características: | ||
| + | * se pueden pasar por parámetro al construir la imagen **--build-arg** | ||
| + | * no se incluyen como parte del histórico de capas de la imagen, a menos que se defina explícitamente en **Dockerfile** | ||
| + | |||
| + | == ONBUILD | ||
| + | trigger que se ejecuta cuando la imagen es usada como base para otra imagen | ||
| + | * '' | ||
| + | * no se pueden anidar 2 ONBUILD | ||
| + | * se pueden poner varios ONBUILD y serán ejecutados en el mismo orden | ||
| + | * se aplica en el primer nivel "de herencia" | ||
| + | * reutilización de una imagen " | ||
| + | |||
| + | == STOPSIGNAL | ||
| + | define la señal que se enviará al contenedor cuando este se pare | ||
| + | |||
| + | == HEALTHCHECK | ||
| + | comunicar el estado de un contenedor en tiempo de ejecución | ||
| + | * '' | ||
| + | * '' | ||
| + | * opciones: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * comando: | ||
| + | * comando de terminal o array JSON (como en CMD/ | ||
| + | * el código de salida indica el estado del contenedor: | ||
| + | * 0 - success | ||
| + | * 1 - unhealthy | ||
| + | * 2 - reserved (no usar) | ||
| + | * la salida del comando - en fase de depuración - se puede consultar a través de '' | ||
| + | * solo puede haber 1 HEALTCHECK en el fichero **Dockerfile**, | ||
| + | |||
| + | == SHELL | ||
| + | indica que shell será usada por defecto | ||
| + | * '' | ||
| + | * por defecto: | ||
| + | * LINUX: '' | ||
| + | * WINDOWS: '' | ||
| + | * se puede usar varias veces en el **Dockerfile** y las instrucciones que precisen de un shell usarán el establecido en ese momento | ||
| + | * afecta a **CMD**, **ENTRYPOINT**, | ||