Fly.io lets you deploy Docker containers that will be compiled as a Firecracker VM and run in locations around the world.
Fly offer a number of ways to build and deploy apps. For many frameworks you can run fly launch
and it will detect the framework and configure a container for you. For others you can pass it a Dockerfile
which will be built and deployed. But you can also push your own images to a Docker registry and deploy them to Fly.
Today I figured out how to use Fly's own registry to deploy an app.
Fly's registry is called registry.fly.io
. To use it, you need to tag your Docker images with a tag that begins with that string.
Every Fly app gets its own registry subdomain. You can create apps in a number of ways, but the easiest is to use the Fly CLI:
flyctl apps create datasette-demo
Fly app names must be globally unique across all of Fly - you will get an error if the app name is already taken.
You can create an app with a random, freely available name using the --generate-name
option:
~ % flyctl apps create --generate-name
? Select Organization: Simon Willison (personal)
New app created: rough-dew-1296
Now that you have an app name, you can tag your Docker image using:
registry.fly.io/your-app-name:unique-tag-for-your-image
If you are building an image using Docker on your machine, you can run this command in the same directory as your Dockerfile
:
docker build -t registry.fly.io/datasette-demo:datasette-demo-v0 .
In order to push your image to Fly, you will first need to authenticate.
The flyctl auth docker
command will do this for you:
~ % flyctl auth docker
Authentication successful. You can now tag and push images to registry.fly.io/{your-app}
This works by hooking into Docker's own authentication mechanism. You can see what it has done by looking at your ~/.docker/config.json
file. Mine looks like this:
{
"auths": {
"registry.fly.io": {
"auth": "... secret token here ..."
}
,
"experimental": "disabled",
"stackOrchestrator": "swarm"
}
Now you can push your image to the registry like this:
docker push registry.fly.io/datasette-demo:datasette-demo-v0
Now that your image is pushed, you can deploy an instance of it like this:
flyctl deploy --app datasette-demo \
--image registry.fly.io/datasette-demo:datasette-demo-v0
A few seconds later your app will be running at:
https://name-of-your-app.fly.dev/
Created 2022-05-21T19:33:19-07:00 · Edit