diff --git a/content/posts/notes_general/notes_docker.md b/content/posts/notes_general/notes_docker.md index c7544dd..6368d69 100644 --- a/content/posts/notes_general/notes_docker.md +++ b/content/posts/notes_general/notes_docker.md @@ -262,7 +262,8 @@ Evidentemente para construir un _dockerfile_ no basta con conocer Docker. Si qui ### Ejemplos de dockerfiles -Primero +#### Simple +Un *Dockerfile* muy simple para un script de python ```dockerfile FROM python:3 @@ -279,20 +280,39 @@ CMD [ "python", "./your-daemon-or-script.py" ] #### nginx -``` -FROM alpine:3.15 AS builder +Este es un ejemplo de *Dockerfile* `multi-stage`. En un *Dockerfile* de tipo `multi-stage` cada `FROM` (puede haber varios) usa la base que quieras para abrir una nueva etapa (*stage*) Se pueden copiar artefactos de una etapa anterior de forma selectiva. + +- En la primera etapa, que llamaremos `builder` partimos de la imagen `alpine:3.20.1` +- Instalamos: + - `pcre`, una biblioteca de expresiones regulares + - `libxml2` + - `libxslt` + - `gcc`, el compilador gnu + - `make`, la herramienta + - `libc-dev` + - `pcre-dev` + - `zlib-dev` + - `libxml2-dev` + - `libxslt-dev` +- Descargamos el código de *nginx* en el directorio `/tmp` y lo descomprimimos +- Ejecutamos `autoconfigure` especificando que se instale en `/opt` +- Compilamos con `make` e instalamos con `make install` +- Desinstalamos la bibliotecas y borramos la caché (aunque no creo que esto valga para nada, hasta donde yo entiendo la etapa `builder` se descarta) + +``` dockerfile +FROM alpine:3.20.1 AS builder RUN apk add --update \ --no-cache \ - pcre~=8.45 \ - libxml2~=2.9 \ - libxslt~=1.1 \ - gcc~=10.3 \ - make~=4.3 \ - libc-dev~=0.7 \ + pcre~=8.45-r3 \ + libxml2~=2.12.7-r0 \ + libxslt~=1.1.39-r1 \ + gcc~=13.2 \ + make~=4.4 \ + musl-dev~=1.2.5 \ pcre-dev~=8.45 \ - zlib-dev~=1.2 \ - libxml2-dev~=2.9 \ - libxslt-dev~=1.1 && \ + zlib-dev~=1.3.1 \ + libxml2-dev~=2.12.7 \ + libxslt-dev~=1.1.39 && \ cd /tmp && \ wget -q https://github.com/nginx/nginx/archive/master.zip -O nginx.zip && \ unzip nginx.zip && \ @@ -303,7 +323,7 @@ RUN apk add --update \ apk del gcc make libc-dev pcre-dev zlib-dev libxml2-dev libxslt-dev && \ rm -rf /var/cache/apk -FROM alpine:3.15 +FROM alpine:3.20.1 ARG UID=${UID:-1000} ARG GID=${GID:-1000} @@ -311,10 +331,10 @@ ARG GID=${GID:-1000} RUN apk add --update \ --no-cache \ pcre~=8.45 \ - libxml2~=2.9 \ - libxslt~=1.1 \ + libxml2~=2.12.7 \ + libxslt~=1.1.39 \ tini~=0.19 \ - shadow~=4.8 &&\ + shadow~=4.15 &&\ rm -rf /var/cache/apk && \ groupmod -g $GID www-data && \ adduser -u $UID -S www-data -G www-data && \ @@ -333,10 +353,167 @@ RUN chown -R www-data:www-data /html && \ USER www-data + ENTRYPOINT ["tini", "--"] CMD ["/bin/sh", "/entrypoint.sh"] ``` +La segunda etapa empieza en la linea 24 definiendo un par de variables para establecer en `UID` y el `GID` del usuario `www-data` que usaremos dentro del contenedor `nginx` para ejecutar el servidor. + +- Instalamos las bibliotecas: + - `pcre` + - `libxml2` + - `libxslt` + - `tini`, un micro `init` ideal para implementar contenedores ligeros + - `shadow`, el PAM de Alpine +- Limpiamos la caché de instalación de paquetes +- Cambiamos el `GID`para el grupo `www-data` +- Creamos el usuario `www-data` con el `UID` especificado +- Creamos el directorio `/html` +- Copiamos los ejecutables de *nginx* de la etapa anterior +- Copiamos el `nginx.conf` y el `entrypoint.sh` desde el directorio de trabajo del *Dockerfile* +- Declaramos el puerto de acceso y el volumen correspondiente a `/html` +- Ejecutamos como usuario `www-data` el *entrypoint* del contenedor. + +##### Ficheros auxiliares + +**entrypoint** + +El fichero `entrypoint` que hemos usado es muy simple: + +```bash +#!/bin/bash +mediaowner=$(ls -ld /html | awk '{print $3}') +echo "Current /html owner is $mediaowner" +/opt/nginx/sbin/nginx -g "daemon off;" +``` + +El fichero `nginx.conf` tampoco es muy complicado. Dejamos secciones comentadas para tener algunas referencias. + +```nginx +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 8080; + server_name localhost; + + access_log /dev/stdout; + error_log /dev/stdout info; + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + root /html; + index index.html index.htm; + + include mime.types; + try_files $uri $uri/ =404; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} +``` + ## Networks