Switch to cmd array so we can redact

This commit is contained in:
David Heinemeier Hansson
2023-01-08 16:20:06 +01:00
parent 4ec04f8959
commit 998525c93d
9 changed files with 81 additions and 45 deletions

View File

@@ -1,3 +1,5 @@
require "sshkit"
module Mrsk::Commands
class Base
attr_accessor :config
@@ -5,6 +7,16 @@ module Mrsk::Commands
def initialize(config)
@config = config
end
private
def docker(*args)
args.unshift :docker
end
# Copied from SSHKit::Backend::Abstract#redact to be available inside Commands classes
def redact(arg) # Used in execute_command to hide redact() args a user passes in
arg.to_s.extend(SSHKit::Redaction) # to_s due to our inability to extend Integer, etc
end
end
end

View File

@@ -1,37 +1,47 @@
# FIXME: Use Shellwords.join
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} ."
docker :buildx, :build, "--push", "--platform linux/amd64,linux/arm64", "-t", config.absolute_image, "."
end
def pull
"docker pull #{config.absolute_image}"
docker :pull, config.absolute_image
end
def run
"docker run -d --restart unless-stopped --name #{config.service_with_version} #{config.envs} #{config.labels} #{config.absolute_image}"
docker :run,
"-d",
"--restart unless-stopped",
"--name", config.service_with_version,
"-e", redact("RAILS_MASTER_KEY=#{config.master_key}"),
config.envs,
config.labels,
config.absolute_image
end
def start
"docker start #{config.service_with_version}"
docker :start, config.service_with_version
end
def stop
"docker ps -q #{service_filter} | xargs docker stop"
[ "docker ps -q #{service_filter} | xargs docker stop" ]
end
def info
"docker ps #{service_filter}"
docker :ps, service_filter
end
def logs
[ "docker ps -q #{service_filter} | xargs docker logs -f" ]
end
def remove_containers
"docker container prune -f #{service_filter}"
docker :container, :prune, "-f", service_filter
end
def remove_images
"docker image prune -a -f #{service_filter}"
docker :image, :prune, "-a", "-f", service_filter
end
private

View File

@@ -1,9 +1,11 @@
class Mrsk::Commands::Registry < Mrsk::Commands::Base
delegate :registry, to: :config
def login
"docker login #{config.registry["server"]} -u #{config.registry["username"]} -p #{config.registry["password"]}"
docker :login, registry["server"], "-u", redact(registry["username"]), "-p", redact(registry["password"])
end
def logout
"docker logout #{config.registry["server"]}"
docker :logout, registry["server"]
end
end

View File

@@ -1,29 +1,35 @@
class Mrsk::Commands::Traefik < Mrsk::Commands::Base
def run
"docker run --name traefik " +
"-d --restart unless-stopped " +
"-p 80:80 " +
"-v /var/run/docker.sock:/var/run/docker.sock " +
"traefik --providers.docker"
docker :run, "--name traefik",
"-d",
"--restart unless-stopped",
"-p 80:80",
"-v /var/run/docker.sock:/var/run/docker.sock",
"traefik",
"--providers.docker"
end
def start
"docker container start traefik"
docker :container, :start, "traefik"
end
def stop
"docker container stop traefik"
docker :container, :stop, "traefik"
end
def info
"docker ps --filter name=traefik"
docker :ps, "--filter name=traefik"
end
def logs
docker :logs, "traefik"
end
def remove_container
"docker container prune -f --filter label=org.opencontainers.image.title=Traefik"
docker :container, :prune, "-f", "--filter label=org.opencontainers.image.title=Traefik"
end
def remove_image
"docker image prune -a -f --filter label=org.opencontainers.image.title=Traefik"
docker :image, :prune, "-a", "-f", "--filter label=org.opencontainers.image.title=Traefik"
end
end

View File

@@ -38,8 +38,7 @@ class Mrsk::Configuration
end
def envs
parameterize "-e", \
{ "RAILS_MASTER_KEY" => master_key }.merge(env || {})
parameterize "-e", env if env.present?
end
def labels
@@ -56,6 +55,10 @@ class Mrsk::Configuration
{ user: config.ssh_user || "root", auth_methods: [ "publickey" ] }
end
def master_key
ENV["RAILS_MASTER_KEY"] || File.read(Rails.root.join("config/master.key"))
end
private
attr_accessor :config
@@ -72,8 +75,4 @@ class Mrsk::Configuration
def parameterize(param, hash)
hash.collect { |k, v| "#{param} #{k}=#{v}" }.join(" ")
end
def master_key
ENV["RAILS_MASTER_KEY"] || File.read(Rails.root.join("config/master.key"))
end
end