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?
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
pour utiliser pry, vous devez l'exécuter différemment:
docker-compose run --service-ports web
consultez cet article pour plus d'informations:
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.
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.
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