web-dev-qa-db-fra.com

Comment déboguer une application Rails dans le menu fixe avec levier?

J'ai une application Rails exécutée dans un conteneur Docker dans un environnement de développement.

Lorsque j'essaie de le déboguer en plaçant binding.pry quelque part dans le code et attaché au conteneur, je peux voir l'invite pry dans la sortie mais elle ne s'arrête pas dessus et je ne peux pas interagir avec elle comme si elle était sans conteneur docker.

Alors, comment déboguer une application conteneurisée?

33
fey

Si vous utilisez docker-compose, vous pouvez ajouter ces indicateurs à docker-compose.yml:

app:
  tty: true
  stdin_open: true

Et puis attachez-vous à votre processus avec docker attach project_app_1. pry-Rails fonctionne ici maintenant. Assurez-vous que less est installé sur votre conteneur pour une expérience de levier optimale.

cf. https://github.com/docker/compose/issues/423#issuecomment-141995398

54
Gabe Kopley

pour utiliser pry, vous devez l'exécuter différemment:

docker-compose run --service-ports web

consultez cet article pour plus d'informations:

http://blog.carbonfive.com/2015/03/17/docker-Rails-docker-compose-together-in-your-development-workflow/

24
Terri Chu

comme Gabe Kopley réponse, supposez que votre Rails conteneur est appelé app, définissez stdin_open et tty à true:

app:
  stdin_open: true
  tty: true

et j'ai écrit un script bash pour vous faciliter la vie, enregistrez-le dans bin/dev:

#!/bin/bash
docker-compose up -d && docker attach $(docker-compose ps -q app)

n'oubliez pas de rendre dev exécutable par chmod +x bin/dev

Dans votre terminal, saisissez bin/dev, il exécutera automatiquement les conteneurs et attachera le conteneur de l'application. quand binding.pry appelé, vous pouvez taper directement sur le terminal.

8
Yi Feng Xie

J'ai eu ce même problème lorsque je faisais levier dans Passenger. Essayez de changer "pry-Rails" dans le Gemfile pour gem "pry-remote", qui lancera un protocole dRuby ou distribué sans dépendances.

Où vous souhaitez arrêter le code lors de l'exécution, appelez "binding.remote_pry" par opposition à "binding.pry"

Ensuite, appelez simplement remote-pry dans la console pour y accéder. Cela devrait fonctionner de la même manière. Dans votre environnement de test, juste l'habituel binding.pry fonctionne très bien.

5
kalyco

Si vous n'utilisez pas docker-compose cependant, vous pouvez simplement exécuter le conteneur avec -it option.

Par exemple:

docker run -v /Users/adam/Documents/Rails/Blog/:/usr/src/app -p 3000:3000 -it blog
1
Adam Sibik