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 def pull docker :pull, config.absolute_image end def run(role: :web) role = config.role(role) docker :run, "-d", "--restart unless-stopped", "--name", config.service_with_version, "-e", redact("RAILS_MASTER_KEY=#{config.master_key}"), *config.env_args, *role.label_args, config.absolute_image, role.cmd end def start docker :start, config.service_with_version end def stop [ "docker ps -q #{service_filter.join(" ")} | xargs docker stop" ] end def info docker :ps, *service_filter end def logs [ "docker ps -q #{service_filter.join(" ")} | xargs docker logs -f" ] end def exec(*command) docker :exec, "-e", redact("RAILS_MASTER_KEY=#{config.master_key}"), *config.env_args, config.service_with_version, *command end def console "ssh -t #{config.ssh_user}@#{config.primary_host} 'docker exec -it -e RAILS_MASTER_KEY=#{config.master_key} #{config.env_args.join(" ")} #{config.service_with_version} bin/rails c'" end def list_containers docker :container, :ls, "-a", *service_filter end def remove_containers docker :container, :prune, "-f", *service_filter end def remove_images docker :image, :prune, "-a", "-f", *service_filter end private def service_filter [ "--filter", "label=service=#{config.service}" ] end end