Build di immagini

Semplice Dockerfile

Occorre creare il Dockerfile.

Vogliamo un'immagine per il contatore infinito:

mkdir -p ~/docker/ex/dk1 
cd ~/docker/ex/dk1
vim forever.sh
#! /bin/bash
x=0 
while true
do
  x=$[x + 1] 
  echo $x 
  sleep 1 
done

Editare il Dockerfile:

vim Dockerfile
FROM ubuntu
MAINTAINER Hugh Fray <hugh@stormforce.ac>
COPY forever.sh /usr/local/bin/forever.sh
RUN chmod +x /usr/local/bin/forever.sh
CMD ["/usr/local/bin/forever.sh"]

Costruire l'immagine:

docker build -t forever1 .

Ove:

  • -t forever1 : nome che diamo all'immagine
  • . : directory di build

Verificare e lanciare l'immagine costruita:

docker images
docker run -d --name my_forever1 forever1
docker logs my_forever1

Dockerfile più complesso

Un possibile sempio di Dockerfile per nginx.

Nella directory di contesto:

mkdir -p ~/docker/ex/nginx-ubuntu
cd ~/docker/ex/nginx-ubuntu
vim Dockerfile
FROM ubuntu

# Install Nginx.
RUN \
  apt-get update && \
  apt-get install -y nginx && \
  rm -rf /var/lib/apt/lists/* && \
  echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
  chown -R www-data:www-data /var/lib/nginx

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Define working directory.
WORKDIR /etc/nginx

# Define default command.
CMD ["nginx"]

# Expose ports.
EXPOSE 80
EXPOSE 443

Perchè tutti gli &&

Si può avere in alternativa:

  • una serie di comandi RUN ciascuno dei quali compie un'operazione
  • un unico comando RUN che compie più operazioni concatenate da &&

Il secondo metodo è migliore per i seguenti motivi:

  • Ogni RUN produce un'immagine intermedia, appesantendo il processo di generazione
  • L'operatore && non esegue il comando che segue se quello precedente è fallito e termina subito il processamento del Dockerfile.

Ogni singolo RUN di successo procede al prossimo RUN e se uno degli ultimi fallisce, occorre più tempo per interrompere il processamento del Dockerfile.

Generazione di Immagine

Posizionarsi nella directory di contesto

  • contiene il Dockerfile e tutto quello che serve

Generazione:

docker build [opzioni] -t immagine .

Opzioni principali:

  • --no-cache - ricostruisce completamente da zero
  • -q - sopprime i messaggi di progresso ad output

Vi sono numerose altre opzioni. Listarle con:

docker build --help

Nel nostro esempio:

cd ~/docker/ex/nginx-ubuntu
docker build -t nginx-ubuntu .

Con base Ubuntu è un processo piuttosto lungo.