Class: Kamal::Commands::Proxy
Defined Under Namespace
Modules: CertTransfer
Constant Summary
collapse
- CONFIG_DIGEST_LABEL =
"org.kamal.proxy-config-digest"
CertTransfer::CERT_ARCHIVE_FILENAME, CertTransfer::CERT_IMPORT_STAGING_FILENAME, CertTransfer::CONTAINER_IMPORT_PATH
Constants inherited
from Base
Base::DOCKER_HEALTH_STATUS_FORMAT, Base::NO_HEALTHCHECK
Instance Attribute Summary collapse
Attributes inherited from Base
#config
Instance Method Summary
collapse
-
#boot_config ⇒ Object
-
#cache_purge(service, path_prefix: nil) ⇒ Object
-
#cache_stats(count: false, json: false) ⇒ Object
-
#cleanup_traefik ⇒ Object
-
#config_digest ⇒ Object
-
#container_id(only_running: false) ⇒ Object
-
#disable_restart ⇒ Object
Cancel the restart policy before draining: drain makes the proxy exit on its own, which - unlike docker stop - an active restart policy would undo.
-
#domains(subcommand) ⇒ Object
-
#drain(timeout: nil) ⇒ Object
-
#ensure_apps_config_directory ⇒ Object
-
#ensure_proxy_directory ⇒ Object
-
#follow_logs(host:, timestamps: true, grep: nil, grep_options: nil) ⇒ Object
-
#holder_container_id ⇒ Object
-
#info ⇒ Object
-
#initialize(config, host:) ⇒ Proxy
constructor
-
#list(name: container_name, json: false) ⇒ Object
-
#loadbalancer ⇒ Object
-
#logs(timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil) ⇒ Object
-
#mount_destinations ⇒ Object
One mount destination per line - what the running container was actually booted with, as opposed to what the current configuration would mount.
-
#next_container_name ⇒ Object
-
#port_holder? ⇒ Boolean
Zero-downtime handoff commands (proxy/run port_holder mode).
-
#promote_next_container ⇒ Object
-
#pull ⇒ Object
-
#read_boot_options ⇒ Object
-
#read_image ⇒ Object
-
#read_image_version ⇒ Object
-
#read_run_command ⇒ Object
-
#remove_container ⇒ Object
-
#remove_image ⇒ Object
-
#remove_proxy_directory ⇒ Object
-
#remove_proxy_secrets_file ⇒ Object
Static path rather than proxy_run_config.secrets_path: the file must be removable precisely when the run config (or its secrets) is gone.
-
#remove_stopped_container(name: container_name) ⇒ Object
-
#reset_boot_options ⇒ Object
-
#reset_image ⇒ Object
-
#reset_image_version ⇒ Object
-
#reset_run_command ⇒ Object
-
#run(digest: nil, name: nil) ⇒ Object
-
#run_holder ⇒ Object
-
#start ⇒ Object
-
#start_holder_or_run ⇒ Object
-
#start_or_run(digest: nil) ⇒ Object
-
#stop(name: container_name, timeout: nil) ⇒ Object
-
#version ⇒ Object
-
#wait_for_exit(name: container_name) ⇒ Object
#certs_archive_container_path, #certs_archive_host_path, #certs_import_host_path, #export_certs, #export_certs_offline, #import_certs, #remove_certs_archive, #remove_certs_import
Methods inherited from Base
#container_id_for, #ensure_docker_installed, #make_directory, #make_directory_for, #read_file, #remove_directory, #remove_file, #run_over_ssh
Constructor Details
#initialize(config, host:) ⇒ Proxy
Returns a new instance of Proxy.
9
10
11
12
|
# File 'lib/kamal/commands/proxy.rb', line 9
def initialize(config, host:)
super(config)
@proxy_run_config = config.proxy_run(host)
end
|
Instance Attribute Details
#proxy_run_config ⇒ Object
Returns the value of attribute proxy_run_config.
5
6
7
|
# File 'lib/kamal/commands/proxy.rb', line 5
def proxy_run_config
@proxy_run_config
end
|
Instance Method Details
#boot_config ⇒ Object
192
193
194
|
# File 'lib/kamal/commands/proxy.rb', line 192
def boot_config
[ :echo, "#{substitute(read_boot_options)} #{substitute(read_image)}:#{substitute(read_image_version)} #{substitute(read_run_command)}" ]
end
|
#cache_purge(service, path_prefix: nil) ⇒ Object
78
79
80
|
# File 'lib/kamal/commands/proxy.rb', line 78
def cache_purge(service, path_prefix: nil)
docker :exec, container_name, "kamal-proxy", :cache, :purge, service, *optionize({ "path-prefix": path_prefix }.compact)
end
|
#cache_stats(count: false, json: false) ⇒ Object
74
75
76
|
# File 'lib/kamal/commands/proxy.rb', line 74
def cache_stats(count: false, json: false)
docker :exec, container_name, "kamal-proxy", :cache, :stats, *optionize({ count: count || nil, json: json || nil }.compact)
end
|
#cleanup_traefik ⇒ Object
165
166
167
168
169
170
171
172
|
# File 'lib/kamal/commands/proxy.rb', line 165
def cleanup_traefik
chain \
docker(:container, :stop, "traefik"),
combine(
docker(:container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=Traefik"),
docker(:image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=Traefik")
)
end
|
#config_digest ⇒ Object
54
55
56
|
# File 'lib/kamal/commands/proxy.rb', line 54
def config_digest
docker :inspect, container_name, "--format", "'{{ index .Config.Labels \"#{CONFIG_DIGEST_LABEL}\" }}'"
end
|
#container_id(only_running: false) ⇒ Object
58
59
60
|
# File 'lib/kamal/commands/proxy.rb', line 58
def container_id(only_running: false)
container_id_for(container_name: container_name, only_running: only_running)
end
|
#disable_restart ⇒ Object
Cancel the restart policy before draining: drain makes the proxy exit on
its own, which - unlike docker stop - an active restart policy would undo.
120
121
122
|
# File 'lib/kamal/commands/proxy.rb', line 120
def disable_restart
docker :update, "--restart=no", container_name
end
|
#domains(subcommand) ⇒ Object
153
154
155
|
# File 'lib/kamal/commands/proxy.rb', line 153
def domains(subcommand)
docker :exec, container_name, "kamal-proxy", "domains", subcommand
end
|
#drain(timeout: nil) ⇒ Object
124
125
126
|
# File 'lib/kamal/commands/proxy.rb', line 124
def drain(timeout: nil)
docker :exec, container_name, "kamal-proxy", :drain, *("--drain-timeout=#{timeout}s" if timeout)
end
|
#ensure_apps_config_directory ⇒ Object
182
183
184
|
# File 'lib/kamal/commands/proxy.rb', line 182
def ensure_apps_config_directory
make_directory config.proxy_boot.apps_directory
end
|
#ensure_proxy_directory ⇒ Object
174
175
176
|
# File 'lib/kamal/commands/proxy.rb', line 174
def ensure_proxy_directory
make_directory config.proxy_boot.host_directory
end
|
#follow_logs(host:, timestamps: true, grep: nil, grep_options: nil) ⇒ Object
146
147
148
149
150
151
|
# File 'lib/kamal/commands/proxy.rb', line 146
def follow_logs(host:, timestamps: true, grep: nil, grep_options: nil)
run_over_ssh pipe(
docker(:logs, container_name, ("--timestamps" if timestamps), "--tail", "10", "--follow", "2>&1"),
(%(grep "#{grep}"#{" #{grep_options}" if grep_options}) if grep)
).join(" "), host: host
end
|
#holder_container_id ⇒ Object
114
115
116
|
# File 'lib/kamal/commands/proxy.rb', line 114
def holder_container_id
container_id_for(container_name: proxy_run_config.holder_container_name, only_running: true)
end
|
#info ⇒ Object
44
45
46
|
# File 'lib/kamal/commands/proxy.rb', line 44
def info
docker :ps, "--filter", "'name=^#{container_name}$'"
end
|
#list(name: container_name, json: false) ⇒ Object
70
71
72
|
# File 'lib/kamal/commands/proxy.rb', line 70
def list(name: container_name, json: false)
docker :exec, name, "kamal-proxy", :list, *("--json" if json)
end
|
#loadbalancer ⇒ Object
228
229
230
|
# File 'lib/kamal/commands/proxy.rb', line 228
def loadbalancer
@loadbalancer ||= Kamal::Commands::Loadbalancer.new(config, loadbalancer_config: KAMAL.loadbalancer_config)
end
|
#logs(timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil) ⇒ Object
140
141
142
143
144
|
# File 'lib/kamal/commands/proxy.rb', line 140
def logs(timestamps: true, since: nil, lines: nil, grep: nil, grep_options: nil)
pipe \
docker(:logs, container_name, ("--since #{since}" if since), ("--tail #{lines}" if lines), ("--timestamps" if timestamps), "2>&1"),
("grep '#{grep}'#{" #{grep_options}" if grep_options}" if grep)
end
|
#mount_destinations ⇒ Object
One mount destination per line - what the running container was actually
booted with, as opposed to what the current configuration would mount.
84
85
86
|
# File 'lib/kamal/commands/proxy.rb', line 84
def mount_destinations
docker :inspect, container_name, "--format", "'{{range .Mounts}}{{println .Destination}}{{end}}'"
end
|
#next_container_name ⇒ Object
94
95
96
|
# File 'lib/kamal/commands/proxy.rb', line 94
def next_container_name
"#{container_name}-next"
end
|
#port_holder? ⇒ Boolean
Zero-downtime handoff commands (proxy/run port_holder mode)
90
91
92
|
# File 'lib/kamal/commands/proxy.rb', line 90
def port_holder?
proxy_run_config&.port_holder? || false
end
|
136
137
138
|
# File 'lib/kamal/commands/proxy.rb', line 136
def promote_next_container
docker :container, :rename, next_container_name, container_name
end
|
#pull ⇒ Object
62
63
64
65
66
67
68
|
# File 'lib/kamal/commands/proxy.rb', line 62
def pull
if proxy_run_config
docker :pull, proxy_run_config.image
else
docker :pull, "#{substitute(read_image)}:#{substitute(read_image_version)}"
end
end
|
#read_boot_options ⇒ Object
196
197
198
|
# File 'lib/kamal/commands/proxy.rb', line 196
def read_boot_options
read_file(config.proxy_boot.options_file, default: config.proxy_boot.default_boot_options.join(" "))
end
|
#read_image ⇒ Object
200
201
202
|
# File 'lib/kamal/commands/proxy.rb', line 200
def read_image
read_file(config.proxy_boot.image_file, default: config.proxy_boot.image_default)
end
|
#read_image_version ⇒ Object
#read_run_command ⇒ Object
208
209
210
|
# File 'lib/kamal/commands/proxy.rb', line 208
def read_run_command
read_file(config.proxy_boot.run_command_file)
end
|
#remove_container ⇒ Object
157
158
159
|
# File 'lib/kamal/commands/proxy.rb', line 157
def remove_container
docker :container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"
end
|
#remove_image ⇒ Object
161
162
163
|
# File 'lib/kamal/commands/proxy.rb', line 161
def remove_image
docker :image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"
end
|
#remove_proxy_directory ⇒ Object
178
179
180
|
# File 'lib/kamal/commands/proxy.rb', line 178
def remove_proxy_directory
remove_directory config.proxy_boot.host_directory
end
|
#remove_proxy_secrets_file ⇒ Object
Static path rather than proxy_run_config.secrets_path: the file must be
removable precisely when the run config (or its secrets) is gone.
#remove_stopped_container(name: container_name) ⇒ Object
132
133
134
|
# File 'lib/kamal/commands/proxy.rb', line 132
def remove_stopped_container(name: container_name)
docker :container, :rm, name
end
|
#reset_boot_options ⇒ Object
212
213
214
|
# File 'lib/kamal/commands/proxy.rb', line 212
def reset_boot_options
remove_file config.proxy_boot.options_file
end
|
#reset_image ⇒ Object
216
217
218
|
# File 'lib/kamal/commands/proxy.rb', line 216
def reset_image
remove_file config.proxy_boot.image_file
end
|
#reset_image_version ⇒ Object
220
221
222
|
# File 'lib/kamal/commands/proxy.rb', line 220
def reset_image_version
remove_file config.proxy_boot.image_version_file
end
|
#reset_run_command ⇒ Object
224
225
226
|
# File 'lib/kamal/commands/proxy.rb', line 224
def reset_run_command
remove_file config.proxy_boot.run_command_file
end
|
#run(digest: nil, name: nil) ⇒ Object
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/kamal/commands/proxy.rb', line 14
def run(digest: nil, name: nil)
if proxy_run_config
docker \
:run,
"--name", name || container_name,
*proxy_run_config.network_args,
"--detach",
"--restart", "unless-stopped",
"--volume", "kamal-proxy-config:/home/kamal-proxy/.config/kamal-proxy",
*config_digest_label_args(digest),
*proxy_run_config.docker_options_args,
*proxy_run_config.image,
*proxy_run_config.run_command
else
pipe boot_config, xargs(docker_run(digest: digest))
end
end
|
#run_holder ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/kamal/commands/proxy.rb', line 98
def run_holder
docker \
:run,
"--name", proxy_run_config.holder_container_name,
"--network", "kamal",
"--detach",
"--restart", "unless-stopped",
*proxy_run_config.holder_docker_args,
*proxy_run_config.image,
"kamal-proxy", "hold"
end
|
#start ⇒ Object
32
33
34
|
# File 'lib/kamal/commands/proxy.rb', line 32
def start
docker :container, :start, container_name
end
|
#start_holder_or_run ⇒ Object
110
111
112
|
# File 'lib/kamal/commands/proxy.rb', line 110
def start_holder_or_run
combine docker(:container, :start, proxy_run_config.holder_container_name), run_holder, by: "||"
end
|
#start_or_run(digest: nil) ⇒ Object
40
41
42
|
# File 'lib/kamal/commands/proxy.rb', line 40
def start_or_run(digest: nil)
combine start, run(digest: digest), by: "||"
end
|
#stop(name: container_name, timeout: nil) ⇒ Object
36
37
38
|
# File 'lib/kamal/commands/proxy.rb', line 36
def stop(name: container_name, timeout: nil)
docker :container, :stop, *("--time #{timeout}" if timeout), name
end
|
#version ⇒ Object
48
49
50
51
52
|
# File 'lib/kamal/commands/proxy.rb', line 48
def version
pipe \
docker(:inspect, container_name, "--format '{{.Config.Image}}'"),
[ :awk, "-F:", "'{print \$NF}'" ]
end
|
#wait_for_exit(name: container_name) ⇒ Object
128
129
130
|
# File 'lib/kamal/commands/proxy.rb', line 128
def wait_for_exit(name: container_name)
docker :wait, name
end
|