Salta al contingut
Monitor amb codi obert en un editor, en una sala a les fosques amb una llum càlida al fons

Dockerfiles avançats: HEALTHCHECK, heredoc i muntatges de BuildKit

Segona part de les bones pràctiques amb Dockerfiles: comprovacions de salut, sintaxi heredoc i RUN --mount per a secrets, memòria cau i claus SSH.

Per Víctor Piles TemporalSRE i tècnic de sistemesPublicat el 4 min de lectura

Si heu arribat aquí sense llegir la primera part, us recomane llegir-la i tornar. En aquesta segona entrega continue amb consells i bones pràctiques per a escriure Dockerfiles, a un nivell més avançat.

En resum: afegiu un HEALTHCHECK perquè Docker sàpiga si el contenidor funciona de veritat i consulteu-lo amb docker inspect; useu la sintaxi heredoc de BuildKit per a escriure diverses ordres o crear fitxers sense copiar-los; i useu RUN --mount perquè la compilació accedisca a secrets, memòries cau o claus SSH sense deixar-los a la imatge.

Genereu comprovacions de salut

  • La instrucció HEALTHCHECK indica a Docker com provar un contenidor per verificar que funciona correctament. Per exemple, un servidor es pot quedar en un bucle infinit de processos i no acceptar més connexions encara que el procés continue en marxa.
  • Estalvia temps en la detecció d’errors: podeu inspeccionar els vostres contenidors.
  • El sistema detecta errors que a una persona li costaria veure.
  • La comprovació s’executa a intervals de segons des que arrenca el contenidor. Si una comprovació s’allarga més del compte per qualsevol motiu, es considera fallida.
FROM nginx
WORKDIR /usr/share/nginx/html
COPY . .
HEALTHCHECK --interval=10m --timeout=10s \
CMD curl --fail http://localhost/ || exit 1

En aquest cas es comprova cada 10 minuts que el servidor web és capaç de servir la pàgina en 10 segons.

Consulteu les comprovacions de salut

Per veure el resultat de les comprovacions, inspeccioneu els contenidors aixecats:

docker inspect --format='{{json .State.Health}}' $IDContenedor
{"Status":"healthy","FailingStreak":0,"Log":[{"Start":"2022-10-19T18:00:00.809087707Z","End":"2022-10-19T18:00:00.909087707Z","ExitCode":0,"Output":"Web test"}]}

En aquest cas s’inspecciona el contenidor en format JSON. Es veu que l’estat és healthy i que mostra l’eixida de la nostra web.

Creeu fitxers amb la sintaxi heredoc

  • BuildKit incorpora millores de rendiment, de seguretat i més. Entre elles, accepta la sintaxi heredoc, amb la qual el que és complex esdevé senzill: per exemple, crear fitxers sense copiar-los al contenidor.
  • BuildKit és el motor de compilació per defecte des de Docker Engine 23.0; en versions anteriors cal activar-lo amb la variable d’entorn DOCKER_BUILDKIT=1 en fer el docker build.
  • Afegiu també al principi del Dockerfile la línia # syntax=docker/dockerfile:1.
# syntax=docker/dockerfile:1
FROM alpine
RUN <<EOF
apk update
apk upgrade
EOF

En aquest cas, amb la instrucció RUN, s’actualitza el sistema.

# syntax=docker/dockerfile:1
FROM httpd
COPY <<EOF /usr/local/apache2/htdocs/index.html
<h1>Hello World!</h1>
<p>Test web</p>
EOF

En aquest cas es genera una web accessible escrivint el codi directament a la imatge.

Creeu muntatges

RUN --mount permet crear muntatges als quals el procés de compilació pot accedir per fer accions. Per exemple, la compilació pot llegir secrets, com credencials d’AWS, i pujar contingut a S3 sense necessitat de variables d’entorn a la vista.

Hi ha diferents tipus de muntatge:

  • Bind: el muntatge per defecte; enllaça directoris amb permisos de només lectura.
  • Cache: munta directoris temporals per a la memòria cau de compiladors i gestors de paquets.
  • Secret: muntatge per accedir a secrets.
  • SSH: permet que el contenidor accedisca a les claus SSH a través de l’agent.

Exemples:

# syntax=docker/dockerfile:1
FROM python:3
RUN pip install awscli
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
  aws s3 cp test.txt s3://bucket/test.txt --expires 2022-10-31T20:30:00Z

En aquest cas s’accedeix a un bucket d’S3 mitjançant secrets i es copien fitxers. El secret es passa en compilar, per exemple amb docker build --secret id=aws,src=$HOME/.aws/credentials .

# syntax=docker/dockerfile:1
FROM alpine
RUN apk add openssh-client
RUN mkdir -pm 700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh \
ssh git@github.com 2>&1 | tee /dirname

En aquest cas, amb l’agent SSH, la compilació accedeix a la destinació i bolca l’eixida amb tee a un fitxer. L’agent es passa en compilar amb docker build --ssh default .

Usar secrets i muntatges en lloc de copiar credencials a la imatge és una de les coses que revise en la gestió de vulnerabilitats, i la compilació d’imatges forma part dels pipelines que munte en infraestructura com a codi, GitOps i CI/CD. Si necessiteu alguna cosa, escriviu-me des de contacte.

Publicat originalment en anglés a Medium.

Tornar al blog

Expliqueu-nos el vostre cas

En una trucada gratuïta de 20 minuts veiem on sou i per on començar. Sense compromís.

Reservar una trucada de 20 minuts
WhatsApp