diff --git a/README.md b/README.md index 034e0a77..3b0ce634 100644 --- a/README.md +++ b/README.md @@ -633,6 +633,16 @@ traefik: entrypoints.otherentrypoint.address: ':9000' ``` +### Rebooting Traefik + +If you make changes to Traefik args or labels, you'll need to reboot with: + +`mrsk traefik reboot` + +In production, reboot the Traefik containers one by one with a slower but safer approach, using a rolling reboot: + +`mrsk traefik reboot --rolling` + ### Configuring build args for new images Build arguments that aren't secret can also be configured: diff --git a/lib/mrsk/cli/traefik.rb b/lib/mrsk/cli/traefik.rb index 95707789..b96b59d6 100644 --- a/lib/mrsk/cli/traefik.rb +++ b/lib/mrsk/cli/traefik.rb @@ -1,24 +1,25 @@ class Mrsk::Cli::Traefik < Mrsk::Cli::Base desc "boot", "Boot Traefik on servers" - def boot(login: true) + def boot mutating do on(MRSK.traefik_hosts) do - execute *MRSK.registry.login if login + execute *MRSK.registry.login execute *MRSK.traefik.run, raise_on_non_zero_exit: false end end end desc "reboot", "Reboot Traefik on servers (stop container, remove container, start new container)" + option :rolling, type: :boolean, default: false, desc: "Reboot traefik on hosts in sequence, rather than in parallel" def reboot mutating do - on(MRSK.traefik_hosts) do + on(MRSK.traefik_hosts, in: options[:rolling] ? :sequence : :parallel) do + execute *MRSK.auditor.record("Rebooted traefik"), verbosity: :debug execute *MRSK.registry.login + execute *MRSK.traefik.stop, raise_on_non_zero_exit: false + execute *MRSK.traefik.remove_container + execute *MRSK.traefik.run, raise_on_non_zero_exit: false end - - stop - remove_container - boot(login: false) end end diff --git a/test/cli/traefik_test.rb b/test/cli/traefik_test.rb index 450181bb..aaad75d7 100644 --- a/test/cli/traefik_test.rb +++ b/test/cli/traefik_test.rb @@ -10,11 +10,18 @@ class CliTraefikTest < CliTestCase test "reboot" do Mrsk::Commands::Registry.any_instance.expects(:login).twice - Mrsk::Cli::Traefik.any_instance.expects(:stop) - Mrsk::Cli::Traefik.any_instance.expects(:remove_container) - Mrsk::Cli::Traefik.any_instance.expects(:boot).with(login: false) - run_command("reboot") + run_command("reboot").tap do |output| + assert_match "docker container stop traefik", output + assert_match "docker container prune --force --filter label=org.opencontainers.image.title=Traefik", output + assert_match "docker run --name traefik --detach --restart unless-stopped --publish 80:80 --volume /var/run/docker.sock:/var/run/docker.sock --log-opt max-size=\"10m\" #{Mrsk::Commands::Traefik::DEFAULT_IMAGE} --providers.docker --log.level=\"DEBUG\"", output + end + end + + test "reboot --rolling" do + run_command("reboot", "--rolling").tap do |output| + assert_match "Running docker container prune --force --filter label=org.opencontainers.image.title=Traefik on 1.1.1.1", output.lines[3] + end end test "start" do