Al definir un Dockerfile, seleccionar una imagen oficial desde los registros de Docker:
FROM debian
Todos los ficheros que no sean necesarios para la creación de la imagen deben de añadirse al .dockerignore.
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 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 donde trabajaremos (en caso de necesitarlo).
WORKDIR /app
Definir los puertos para poderse conectar posteriormente.
EXPOSE 443
Definir las variables de entorno necesarias.
ENV GOPATH=/go
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 que van a necesitar ser montados.
VOLUME /var/lib/mysql
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}
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