Uso de RubyMine con Docker-compose

Hace un tiempo escribí como sobre usar RubyMine con Docker. En ocasiones, cuando trabajamos con aplicaciones web es habitual utilizar una configuración docker-compose que incluya un contenedor con el runtime Ruby y algunos otros contenedores por ejemplo con MySql, Redis, etc. Para usar RubyMine en estos escenarios debemos hacer lo siguiente.

Armamos la configuración docker-compose y la ponemos a correr asegurándonos de el contendedor que contiene el runtime Ruby quede levantado. Esto puede hacerse agregando las siguientes 3 líneas en la definición del contenedor:

    command: "/bin/bash"
    stdin_open: true # esto es equivalente a hacer docker run -i
    tty: true        # esto es equivalente a hacer docker run -t

Luego, abrimos el proyecto en RubyMine y ajustamos la configuración en «Ruby SDK and Gems». Agregamos una nueva configuración remota.

En la ventana emergente debemos seleccionar la opción «Docker Compose», en «Configuration Files» debemos apuntar al archivo que contiene nuestra configuración de docker-compose y finalmente en «Service» debemos seleccionar el contenedor que contiene el runtime Ruby. Dependiendo de como esté instalado el runtime Ruby en la imagen del contenedor puede que necesitemos ajustar el valor default de «Ruby or version manager path».

Una vez que damos «OK» a ambas ventanas de emergentes el RubyMine puede tardar unos minutos en completar la aplicación de la nueva configuración.

Un detalle más: si queremos utilizar el debugger de RubyMine debemos asegurarnos que nuestro proyecto incluya las gemas «ruby-debug-ide» y «debase» en el Gemfile.

Finalmente les comparto una configuración compose de ejemplo para que se entienda todo el contexto.

version: '3'
services:

  test_db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

  dev_db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

  webapp:
    build: 
      context: .
      dockerfile: Dockerfile.dev
    command: "/bin/bash"
    stdin_open: true # docker run -i
    tty: true        # docker run -t
    ports:
      - "3000:3000"
    expose:
      - 3000
    volumes:
        - .:/app
    environment:
        RACK_ENV: "development"
        TEST_DB_URL: "postgres://postgres:example@test_db:5432/postgres"
        DEV_DB_URL: "postgres://postgres:example@dev_db:5432/postgres"
    depends_on:
      - test_db
      - dev_db

RubyMine con Docker

En la actualidad es cada vez más habitual utilizar Docker como ambiente de desarrollo, o sea: en lugar de instalar el runtime de desarrollo en nuestro host, armamos una imagen Docker con el runtime del proyecto conteniendo también todas dependencias/libs y en nuestro host instalamos tanto solo Docker Desktop y el IDE de nuestra elección.

Esta estrategia resulta especialmente útil en stacks como Ruby donde es habitual tener que utilizar distintas versiones Ruby. Sin embargo cuando pretendemos utilizar IDEs más potentes como RubyMine, que proveen algunas funcionalidades que dependen del runtime (como es el caso de algunos refactorings), es necesario hacer algunos ajustes de configuración en el IDE. Es por ello que grabe un video explicando estos ajustes. Espero les resulte útil.