Run a Ruby on Rails app
In this guide we create and deploy a Ruby on Rails application. To run this example, follow these steps:
-
Install the
kraft
CLI tool and a container runtime engine, e.g. Docker. -
Clone the
examples
repository andcd
into theexamples/ruby3.2-rails/
directory:
git clone https://github.com/kraftcloud/examplescd examples/ruby3.2-rails/
Make sure to log into Unikraft Cloud by setting your token and a metro close to you.
We use fra0
(Frankfurt, 🇩🇪) in this guide:
# Set Unikraft Cloud access tokenexport UKC_TOKEN=token# Set metro to Frankfurt, DEexport UKC_METRO=fra0
When done, invoke the following command to deploy this application on Unikraft Cloud:
kraft cloud deploy -M 1024 -p 443:3000 -e GEM_HOME=/usr/local/bundle -e BUNDLE_APP_CONFIG=/usr/local/bundle .
The output shows the instance URL and other details:
[●] Deployed successfully! │ ├────────── name: ruby32-rails-apa93 ├────────── uuid: 2f85b9db-94f8-45d2-8e38-ed9b56cb8695 ├───────── state: running ├─────────── url: https://aged-waterfall-qraz0s7d.dal0.kraft.host ├───────── image: ruby32-rails@sha256:fdd46011408fdee05644665ad59b24115737e3fdb352169ec2f3f16a45d4f31d ├───── boot time: 577.34 ms ├──────── memory: 1024 MiB ├─────── service: aged-waterfall-qraz0s7d ├── private fqdn: ruby32-rails-apa93.internal ├──── private ip: 172.16.3.3 └────────── args: /usr/bin/ruby /app/bin/rails server -b 0.0.0.0
In this case, the instance name is ruby32-rails-apa93
and the URL is https://aged-waterfall-qraz0s7d.dal0.kraft.host
.
They are different for each run.
Use curl
to query the Unikraft Cloud instance of the Python-based HTTP web server:
curl https://aged-waterfall-qraz0s7d.dal0.kraft.host/hello
[...] <body> <h1>Hello World</h1>Hello, World!
</body>[...]
At any point in time, you can list information about the instance:
kraft cloud instance list
NAME FQDN STATE CREATED AT IMAGE MEMORY ARGS BOOT TIMEruby32-rails-apa93 aged-waterfall-qraz0s7d.dal0.kraft.host running 2 minutes ago ruby32-rails@sha256:fdd46011408fdee... 1.0 GiB /usr/bin/ruby /app/bin/rails server -b 0.0.0.0 577.34 ms
When done, you can remove the instance:
kraft cloud instance remove ruby32-rails-apa93
Customize your Application
To customize the application, update the files in the repository, listed below:
app/
andconfig/
: the contents to update the Rails setupKraftfile
: the Unikraft Cloud specificationDockerfile
: the Docker-specified application filesystem
spec: v0.6
runtime: ruby:3.2
rootfs: ./Dockerfile
cmd: ["/usr/bin/ruby", "/app/bin/rails", "server", "-b", "0.0.0.0"]
FROM ruby:3.2.2-bookworm AS build
RUN gem install railsRUN rails new app
WORKDIR /appRUN rails generate controller hello
COPY . /app/
FROM scratch
# Ruby Gems & Rails contentsCOPY --from=build /usr/local/bundle /usr/local/bundle
# System libraries[...]
COPY --from=build /app /app
The app/
and config/
directories contain files that are to overwrite generated Rails files:
tree app/ config/
app/|-- controllers/| `-- hello_controller.rb`-- views/ `-- hello/ `-- index.html.erbconfig/|-- environments/| `-- development.rb`-- routes.rb
These files add the configuration (controller, view, route) to print the Hello, World!
message in Rails.
They overwrite the generated Rails configuration to provide the application setup.
Update these files, and other files, with required contents for your own application.
Lines in the Kraftfile
have the following roles:
-
spec: v0.6
: The currentKraftfile
specification version is0.6
. -
runtime: ruby:3.2
: The Unikraft runtime kernel to use is Ruby 3.2. -
rootfs: ./Dockerfile
: Build the application root filesystem using theDockerfile
. -
cmd: ["/usr/bin/ruby", "/app/bin/rails", "server", "-b", "0.0.0.0"]
: Use/usr/bin/ruby /app/bin/rails server -b 0.0.0.0
as the starting command of the instance.
Lines in the Dockerfile
have the following roles:
-
The
RUN
lines install Rails and generate the default application setup for ahello
application. -
COPY . /app/
: Copies the local files (fromapp/
andconfig/
) to the application, overwriting generated contents to provide the user-specified application. -
FROM scratch
: Build the filesystem from thescratch
container image, to create a base image. -
COPY --from=build /app /app
: Copy the application directory to the filesystem.
The following options are available for customizing the application:
-
If only updating the implementation in the
app/
orconfig/
directories, or adding new directories or files to overwrite Rails generated files, no other change is required. -
If changing the application name, change the
hello
name inRUN rails generate controller hello
to a new one. The file names in theapp/
andconfig/
directories have to be similarly updated. -
More extensive changes may require expanding the
Dockerfile
with additionalDockerfile
commands.
Learn More
Use the --help
option for detailed information on using Unikraft Cloud:
kraft cloud --help
Or visit the CLI Reference.