AndrƩs
ā¢
20 October 2023
Probablemente, ya conoces las ventajas de usar Docker, ya lo hemos escuchado o evidenciado en proyectos. Aquà te mostraré como llevar eso a tu aplicación Ruby on Rails. Para realizar lo que se propone necesitas una aplicación Rails, Docker instalado en tu computador y/o tu servidor y motivación para un par de pruebas y error.
Esto es una explicación general y no una guĆa paso a paso. Puede que algunas definiciones necesiten mĆ”s trabajo dependiendo de tu proyecto.
NecesitarƔs un archivo Dockerfile
en la raĆz de tu proyecto con el siguiente contenido:
FROM ruby:3.2.2
RUN apt-get update && apt-get install -y libsodium-dev
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN gem install bundler && bundle install
COPY . .
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
Explicación paso a paso:
ruby:3.2.2
porque mi proyecto utiliza esa versión de Ruby.RUN apt-get update && apt-get install -y libsodium-dev
Por ejemplo, si tu aplicación utiliza libvips para el procesamiento de imĆ”genes, entonces tendrĆ”s que agregar el comando correspondiente para instalarla aquĆ. Puedes fijarte si la imagen que eliges contiene el paquete que necesitas en la pĆ”gina de la imagen
ENTRYPOINT
¿Por qué un entrypoint? BÔsicamente, porque hay comandos que deben correr al momento de levantar un contenedor con nuestra imagen y no al momento de la construcción de la imagen. Un claro ejemplo de esto es el comando db:migrate
.
Entonces necesitaremos de otro archivo en la raĆz de nuestro proyecto llamado entrypoint.sh
con el siguiente contenido:
#!/bin/bash
if [ -f tmp/pids/server.pid ]; then
rm tmp/pids/server.pid
fi
RAILS_ENV=$RAILS_ENV bundle exec rails db:migrate
RAILS_ENV=$RAILS_ENV bundle exec rails s -b 0.0.0.0
Explicación paso a paso:
Puede que según tus necesidades tengas que crear diferentes entrypoints. Imaginemos el caso de que estÔs usando whenever. Tu entrypoint deberÔ actualizar el crontab cada vez que se ejecute, pero tampoco quieres que todos tus contenedores corran los cronjobs al mismo tiempo. Entonces ahà es cuando necesitas de un contenedor que corra tu servicio web y otro con tus cronjobs. O sea, dos entrypoints diferentes para el mismo proyecto.
Para resolver ese caso puedes crear una carpeta en tu proyecto con el nombre entrypoints
y dejar tus diferentes entrypoints ahi. Tu Dockerfile queda con un entrypoint por ādefectoā y cuando necesites lo sobreescribes al momento de correr un contenedor con el flag --entrypoint
.
Dependiendo del entorno en que estamos ejecutando nuestro proyecto, es importante agregar algunas ENVs al contenedor:
credentials.yml.enc
.Si quieres probar tu imagen puedes construirla en local con el siguiente comando:
docker build -t rubyapp .
Luego puedes correr un contenedor a partir de tu imagen:
docker run -p 3000:3000 -e DATABASE_URL={YOUR_DATABASE_URL_HERE} rubyapp
Observación: Aquà es donde necesitaras agregar las variables de entorno, al menos la base de datos.
Nuestro Dockerfile puede volverse mĆ”s complejo segĆŗn nuestras necesidades, pero siempre que se comprenda su funcionamiento, no resultarĆ” difĆcil adaptarlo y realizar modificaciones. Espero que estas indicaciones sean de utilidad, y si consideras que falta algĆŗn tema importante, no dudes en dejarme un comentario al respecto.
disfruta programando