How to get into the Rails console, or other tasks in a buildpack-based deploy

To whom it may concern:

When you deploy an app based on a Buildpack (such as a Ruby on Rails application, but also e.g. a NodeJS or Go application), you might be wondering how to run the tasks which one would normally manage using e.g. heroku run taskname.

In our case, we were deploying a Rails application, and wanted to enter the Rails console.
Just trying /ap/bin/bundle exec rails console did not work, because the Ruby version which is installed globally in the container was Ruby 2.7.0, while the app was running on Ruby 2.6.6.

It turns out that the tasks you are looking for live in the /cnb/process/ directory. (‘cnb’ stands for ‘Cloud Native Buildpacks’).
In our case, /cnb/process/console would open up the Rails console.

It was impossible to find any information about this elsewhere and it was only by trial and error that we found out how it works. I hope that by writing this post some other people might be helped in the future if they are searching for the same thing :slight_smile: .

2 Likes

Oh this is a good note. We’ve talked about building in a default console option so fly ssh console does what you’d expect, too.

Could we also get a way to run a long running process in detached mode?

If you have bash in your image, you should be able to do something like this:

fly ssh console -C "bash nohup ./process &"

You should also check out the fly machine run command. This will let you run one off VMs until they exit successfully (among other things).

1 Like

Happy to find this thread, was tough to find the rails console via ssh.

Perhaps a beginner follow-up question:
I’ve started the rails console process via /cnb/process/console but it either breaks right away, after the first input or is so laggy that it’s pretty much unusable.

Am I doing something wrong, or there just minimal support for it yet?

I’m running into the same problem as Elvinas.

Using /cnb/process/console does not work for me, the ssh session ends every time after a few seconds.

Oh I just replied to your other post. Sometimes Rails VMs crash with an out of memory error when they don’t have enough RAM and you run the console. That would end the session.

If you run fly status --all after this happens you might see a VM in a “failed” state. You can run fly vm status <id> on that one and it should tell you why it exited.

Thanks for your help, the following seems to be working for me :smiley: :

  • fly ssh console
  • launcher rails console
1 Like

When I run launcher rails console, I receive back /bin/sh: 1: launcher: not found

Is your app using a buildpack or a Dockerfile? You can tell from the [build] section of your fly.toml.

If it’s Rails 7, we generate a Dockerfile for it (buildpacks are for older Rails). Assuming that’s the case, you should be able to get Rails console by running:

-> fly ssh console

$ cd /app/
$ rails console

There may be a one liner for the SSH command, we’ll look!

1 Like

I’m running rails 7

I changed it to use 512mb of ram and I can access the console now!

I have 2GB on a staging machine and I can’t get any of this to work.

❯ fly ssh console -C "bash nohup ./process &" -a app
Connecting to top1.nearest.of.app.internal... complete
/usr/bin/nohup: /usr/bin/nohup: cannot execute binary file

Similar error for /cnb/process/console.

# launcher rails console
/bin/sh: 2: launcher: not found
# ./bin/rails console
Your Ruby version is 2.7.0, but your Gemfile specified 2.7.6

Still looking at other community topics to find what I am missing, I used turboku to bootstrap this app, so something must be different.

Try running fly ssh console -C "/bin/bash". Then run ls -la /cnb/process. Does it show anything?

You may need to run something like /lnb/launcher rails console.

 fly ssh console -C "/bin/bash" -a app-name
Connecting to top1.nearest.of.<app-name>.internal... complete
root@96186c8f:/# ls -la /cnb/process
ls: cannot access '/cnb/process': No such file or directory
root@96186c8f:/# /lnb/launcher rails console
bash: /lnb/launcher: No such file or directory
root@96186c8f:/# /cnb/launcher rails console
bash: /cnb/launcher: No such file or directory

I might be in a new architecture or something because I’ve never seen the cnb dir:

root@96186c8f:/# ls
app/    bin/    boot/   dev/    etc/    .fly/   home/   lib/    lib32/  
lib64/  libx32/ media/  mnt/    opt/    proc/   root/   run/    sbin/   
srv/    sys/    tmp/    usr/    var/
root@96186c8f:/# find . | grep launcher
./app/.apt/usr/include/glib-2.0/gio/gsubprocesslauncher.h
./app/.apt/usr/libexec/at-spi-bus-launcher
./app/vendor/bundle/ruby/2.7.0/gems/puma-5.6.4/lib/puma/launcher.rb
./app/vendor/bundle/ruby/2.7.0/gems/sidekiq-6.4.0/lib/sidekiq/launcher.rb
./usr/share/locale-langpack/en_GB/LC_MESSAGES/ubuntu-default-launchers.mo
./usr/share/locale-langpack/en_AU/LC_MESSAGES/ubuntu-default-launchers.mo
./usr/share/locale-langpack/en_CA/LC_MESSAGES/ubuntu-default-launchers.mo
./usr/bin/cautious-launcher
root@96186c8f:/# find . | grep cnb
# no output

I’m running into this very same issue.

Apparently this is due to using multiple buildpacks.

Here is the list of my buildpacks in case that helps:

=== appname Buildpack URLs
1. heroku/metrics
2. https://github.com/heroku/heroku-buildpack-activestorage-preview
3. heroku-community/apt
4. heroku/ruby

The 3rd one allows me to define apt dependencies, here is the Aptfile:

libglib2.0-0
libglib2.0-dev
libpoppler-glib8
libheif-dev
libvips-dev
libvips

I added them mostly to be able to resize uploaded images.