We’ve been using Fly for a while, and deploying commits on our main branch to a staging environment. Up until now, we had been doing this via a multi-stage Dockerfile, but builds had been taking a while since we weren’t doing them locally. So, we opted to build the Docker image locally in CI and deploy to Fly. More info in the Circle docs here. Figured I would post what we learned.
To achieve this, we simplified our Dockerfile to just deploy, rather than to build and deploy, and moved our build step into a Circle step. Then, we simply need to create the Docker image in Circle, push it to Fly, and deploy the image tag. Here’s the code - this is for a Node.js app:
FROM mhart/alpine-node:slim-12.16.3 COPY ./dist . EXPOSE 8080 ENV PORT 8080
Relevant part of config.yml
... backend-deploy: machine: docker_layer_caching: true steps: - checkout - run: name: Deploy Fly command: | wget -qO- 'https://getfly.fly.dev/linux-x86-64/flyctl.tgz' | tar xz ./flyctl auth docker docker build -t registry.fly.io/$FLY_APP_NAME:$CIRCLE_BUILD_NUM . docker push registry.fly.io/$FLY_APP_NAME:$CIRCLE_BUILD_NUM ./flyctl deploy -i registry.fly.io/$FLY_APP_NAME:$CIRCLE_BUILD_NUM -a $FLY_APP_NAME ...
That was all we had to do. One caveat - this broke Bcrypt functionality. Tried adding
RUN apk add --no-cache make gcc g++ python to our Dockerfile, to no avail, so that’s one thing we are still trying to track down. Also note that I had to do this on a machine executor - was getting 401 errors during the deploy step despite the
flyctl auth login line - I suspect it has something to do with the environment.
Hope this helps somebody - it has shrunk our deploy CI step from 8 minutes down to 1-2 minutes.