2.- Dockerfile

Utilizar imágenes base oficiales

Al definir un Dockerfile, seleccionar una imagen oficial desde los registros de Docker:

FROM debian

Ignorar ficheros innecesarios o sensibles

Todos los ficheros que no sean necesarios para la creación de la imagen deben de añadirse al .dockerignore.

Minimizar el número de layers y utilizar multi-lines

Agrupar las layers lo máximo posible y utilizar multi-lines para hacerlo más visible:

RUN apt update -y && apt install -y \
    vim \
    ruby \
    git &&\
    apt clean -y

Utilizar variables

Utilizar variables en la medida de lo posible para facilitar los cambios y hacerlo lo más estándar posible.

ARG RUBY_VERSION=2.1.2

RUN cd /srv &&\
    wget https://ruby-lang.org/pub/ruby/ruby-${RUBY_VERSION}.zip &&\
    unzip ruby-${RUBY_VERSION}.zip &&\
    cd ruby-${RUBY_VERSION} &&\
    ./configure &&\
    make -j"$(nproc)" &&\
    make install &&\
    rm -fr /srv/ruby-${RUBY_VERSION}.zip

Fijar el Workdir

Fijar el workdir donde trabajaremos (en caso de necesitarlo).

WORKDIR /app

Definir los puertos

Definir los puertos para poderse conectar posteriormente.

EXPOSE 443

Definir los environments

Definir las variables de entorno necesarias.

ENV GOPATH=/go

Definir locale del sistema

Generar la locale del sistema para evitar problemas de encoding. Por ejemplo:

RUN echo "es_ES.UTF-8 UTF-8" > /etc/locale.gen \
 && locale-gen es_ES.UTF-8

ENV LANG es_ES.UTF-8
ENV LANGUAGE es_ES:es

Definir los volúmenes

Definir los volúmenes que van a necesitar ser montados.

VOLUME /var/lib/mysql

Utilizar usuarios non-root

Es recomendable utilizar usuarios que no tengan permisos de root. También se puede controlar desde el docker-compose.yml.

ARG DEPLOY_USR=deploys
RUN useradd -ms /bin/bash -u 1000 ${DEPLOY_USR}
USER ${DEPLOY_USR}

Código en la imagen

En entornos productivos (production, staging, nft…) es recomendable añadir el código y la instalación de gemas (en el caso de que sea Ruby) en el propio Dockerfile.

FROM thecocktail/ruby-base:test
ARG GITHUB_TOKEN
ARG DEPLOY_USR=deploys
COPY . /app
RUN useradd -ms /bin/bash ${DEPLOY_USR}&&\
    chmod 755 /app &&\
    chown -R ${DEPLOY_USR} /app
USER ${DEPLOY_USR}
WORKDIR /app
RUN bundle config github.com thecocktail:${GITHUB_TOKEN} &&\
    bundle install -j"$(nproc)" &&\
    bundle config --delete github.com