diff --git a/README.md b/README.md index 11d2ff80..ec95e81f 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ registry: password: real-password ``` -Now you're ready to deploy a multi-arch image (FIXME: currently you need to manually run `docker buildx create --use` once first): +Now you're ready to deploy a multi-arch image: ``` rake mrsk:deploy diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 4b1c8c61..9aa13e8a 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -1,7 +1,5 @@ class Mrsk::Commands::App < Mrsk::Commands::Base def push - # TODO: Run 'docker buildx create --use' when needed - # TODO: Make multiarch an option so Linux users can enjoy speedier builds docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, "." end @@ -64,6 +62,10 @@ class Mrsk::Commands::App < Mrsk::Commands::Base docker :image, :prune, "-a", "-f", *service_filter end + def create_new_builder + docker :buildx, :create, "--use", "--name", config.service + end + private def service_filter [ "--filter", "label=service=#{config.service}" ] diff --git a/lib/tasks/mrsk/app.rake b/lib/tasks/mrsk/app.rake index 7f4433ce..feab3f3c 100644 --- a/lib/tasks/mrsk/app.rake +++ b/lib/tasks/mrsk/app.rake @@ -9,7 +9,15 @@ namespace :mrsk do desc "Build locally and push app image to registry" task :push do - run_locally { execute *app.push } unless ENV["VERSION"] + run_locally do + begin + execute *app.push + rescue SSHKit::Command::Failed => e + error "Missing compatible buildx builder, so creating a new one first" + execute *app.create_new_builder + execute *app.push + end + end unless ENV["VERSION"] end desc "Pull app image from the registry onto servers"