Work out the host and port for the container
Avoid docker inspect: 1. Use the container ID as the host 2. Configure the port, default to 3000
This commit is contained in:
@@ -44,7 +44,7 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
|||||||
|
|
||||||
if role.running_traefik? && KAMAL.proxy_host?(host)
|
if role.running_traefik? && KAMAL.proxy_host?(host)
|
||||||
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
||||||
endpoint = capture_with_info(*app.container_endpoint(version: version)).strip
|
endpoint = capture_with_info(*app.container_id_for_version(version)).strip
|
||||||
raise Kamal::Cli::BootError, "Failed to get endpoint for #{role} on #{host}, did the container boot?" if endpoint.empty?
|
raise Kamal::Cli::BootError, "Failed to get endpoint for #{role} on #{host}, did the container boot?" if endpoint.empty?
|
||||||
|
|
||||||
execute *KAMAL.proxy.deploy(role.container_prefix, target: endpoint)
|
execute *KAMAL.proxy.deploy(role.container_prefix, target: endpoint)
|
||||||
@@ -66,7 +66,7 @@ class Kamal::Cli::App < Kamal::Cli::Base
|
|||||||
|
|
||||||
if role.running_traefik? && KAMAL.proxy_host?(host)
|
if role.running_traefik? && KAMAL.proxy_host?(host)
|
||||||
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
||||||
endpoint = capture_with_info(*app.container_endpoint(version: version)).strip
|
endpoint = capture_with_info(*app.container_id_for_version(version)).strip
|
||||||
if endpoint.present?
|
if endpoint.present?
|
||||||
execute *KAMAL.proxy.remove(role.container_prefix, target: endpoint), raise_on_non_zero_exit: false
|
execute *KAMAL.proxy.remove(role.container_prefix, target: endpoint), raise_on_non_zero_exit: false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class Kamal::Cli::App::Boot
|
|||||||
if proxy_host?
|
if proxy_host?
|
||||||
execute *app.run_for_proxy(hostname: hostname)
|
execute *app.run_for_proxy(hostname: hostname)
|
||||||
if running_traefik?
|
if running_traefik?
|
||||||
endpoint = capture_with_info(*app.container_endpoint(version: version)).strip
|
endpoint = capture_with_info(*app.container_id_for_version(version)).strip
|
||||||
raise Kamal::Cli::BootError, "Failed to get endpoint for #{role} on #{host}, did the container boot?" if endpoint.empty?
|
raise Kamal::Cli::BootError, "Failed to get endpoint for #{role} on #{host}, did the container boot?" if endpoint.empty?
|
||||||
execute *KAMAL.proxy.deploy(role.container_prefix, target: endpoint)
|
execute *KAMAL.proxy.deploy(role.container_prefix, target: endpoint)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class Kamal::Cli::Proxy < Kamal::Cli::Base
|
|||||||
app = KAMAL.app(role: role, host: host)
|
app = KAMAL.app(role: role, host: host)
|
||||||
|
|
||||||
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
version = capture_with_info(*app.current_running_version, raise_on_non_zero_exit: false).strip
|
||||||
endpoint = capture_with_info(*app.container_endpoint(version: version)).strip
|
endpoint = capture_with_info(*app.container_id_for_version(version)).strip
|
||||||
|
|
||||||
if endpoint.present?
|
if endpoint.present?
|
||||||
info "Deploying #{endpoint} for role `#{role}` on #{host}..."
|
info "Deploying #{endpoint} for role `#{role}` on #{host}..."
|
||||||
|
|||||||
@@ -28,11 +28,4 @@ module Kamal::Commands::App::Containers
|
|||||||
container_id_for(container_name: container_name(version)),
|
container_id_for(container_name: container_name(version)),
|
||||||
xargs(docker(:inspect, "--format", DOCKER_HEALTH_LOG_FORMAT))
|
xargs(docker(:inspect, "--format", DOCKER_HEALTH_LOG_FORMAT))
|
||||||
end
|
end
|
||||||
|
|
||||||
def container_endpoint(version:)
|
|
||||||
pipe \
|
|
||||||
container_id_for(container_name: container_name(version)),
|
|
||||||
xargs(docker(:inspect, "--format", "'{{index .NetworkSettings.Networks.kamal.Aliases 0}}{{range $k, $v := .NetworkSettings.Ports}}{{printf \":%s\" $k}}{{break}}{{end}}'")),
|
|
||||||
[ :sed, "-e", "'s/\\/tcp$//'" ]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
class Kamal::Commands::Proxy < Kamal::Commands::Base
|
class Kamal::Commands::Proxy < Kamal::Commands::Base
|
||||||
delegate :argumentize, :optionize, to: Kamal::Utils
|
delegate :argumentize, :optionize, to: Kamal::Utils
|
||||||
delegate :container_name, to: :proxy_config
|
delegate :container_name, :port, to: :proxy_config
|
||||||
|
|
||||||
attr_reader :proxy_config
|
attr_reader :proxy_config
|
||||||
|
|
||||||
@@ -35,11 +35,11 @@ class Kamal::Commands::Proxy < Kamal::Commands::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def deploy(service, target:)
|
def deploy(service, target:)
|
||||||
docker :exec, container_name, "kamal-proxy", :deploy, service, *optionize({ target: target }), *proxy_config.deploy_command_args
|
docker :exec, container_name, "kamal-proxy", :deploy, service, *optionize({ target: "#{target}:#{port}" }), *proxy_config.deploy_command_args
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove(service, target:)
|
def remove(service, target:)
|
||||||
docker :exec, container_name, "kamal-proxy", :remove, service, *optionize({ target: target })
|
docker :exec, container_name, "kamal-proxy", :remove, service, *optionize({ target: "#{target}:#{port}" })
|
||||||
end
|
end
|
||||||
|
|
||||||
def info
|
def info
|
||||||
|
|||||||
@@ -56,6 +56,12 @@ proxy:
|
|||||||
# requests for other apps that do have a host set.
|
# requests for other apps that do have a host set.
|
||||||
host: foo.example.com
|
host: foo.example.com
|
||||||
|
|
||||||
|
# Port
|
||||||
|
#
|
||||||
|
# The port the application is exposed on
|
||||||
|
# Defaults to 80
|
||||||
|
port: 3000
|
||||||
|
|
||||||
# SSL
|
# SSL
|
||||||
#
|
#
|
||||||
# Kamal Proxy can automatically obtain and renew TLS certificates for your applications.
|
# Kamal Proxy can automatically obtain and renew TLS certificates for your applications.
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ class Kamal::Configuration::Proxy
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def port
|
||||||
|
proxy_config.fetch("port", 80)
|
||||||
|
end
|
||||||
|
|
||||||
def image
|
def image
|
||||||
proxy_config.fetch("image", DEFAULT_IMAGE)
|
proxy_config.fetch("image", DEFAULT_IMAGE)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ class CliAppTest < CliTestCase
|
|||||||
assert_match /Renaming container .* to .* as already deployed on 1.1.1.1/, output # Rename
|
assert_match /Renaming container .* to .* as already deployed on 1.1.1.1/, output # Rename
|
||||||
assert_match /docker rename app-web-latest app-web-latest_replaced_[0-9a-f]{16}/, output
|
assert_match /docker rename app-web-latest app-web-latest_replaced_[0-9a-f]{16}/, output
|
||||||
assert_match /docker run --detach --restart unless-stopped --name app-web-latest --network kamal --hostname 1.1.1.1-[0-9a-f]{12} -e KAMAL_CONTAINER_NAME="app-web-latest" -e KAMAL_VERSION="latest" --env-file .kamal\/env\/roles\/app-web.env --log-opt max-size="10m" --label service="app" --label role="web" --label destination dhh\/app:latest/, output
|
assert_match /docker run --detach --restart unless-stopped --name app-web-latest --network kamal --hostname 1.1.1.1-[0-9a-f]{12} -e KAMAL_CONTAINER_NAME="app-web-latest" -e KAMAL_VERSION="latest" --env-file .kamal\/env\/roles\/app-web.env --log-opt max-size="10m" --label service="app" --label role="web" --label destination dhh\/app:latest/, output
|
||||||
assert_match /docker exec kamal-proxy kamal-proxy deploy app-web --target "123"/, output
|
assert_match /docker exec kamal-proxy kamal-proxy deploy app-web --target "123:3000"/, output
|
||||||
assert_match "docker container ls --all --filter name=^app-web-123$ --quiet | xargs docker stop", output
|
assert_match "docker container ls --all --filter name=^app-web-123$ --quiet | xargs docker stop", output
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ class CliProxyTest < CliTestCase
|
|||||||
|
|
||||||
test "reboot" do
|
test "reboot" do
|
||||||
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
||||||
.with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-123$", "--quiet", "|", :xargs, :docker, :inspect, "--format", "'{{index .NetworkSettings.Networks.kamal.Aliases 0}}{{range $k, $v := .NetworkSettings.Ports}}{{printf \":%s\" $k}}{{break}}{{end}}'", "|", :sed, "-e", "'s/\\/tcp$//'")
|
.with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-123$", "--quiet")
|
||||||
.returns("172.1.0.2:80")
|
.returns("abcdefabcdef")
|
||||||
.at_least_once
|
.at_least_once
|
||||||
|
|
||||||
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
||||||
@@ -25,7 +25,7 @@ class CliProxyTest < CliTestCase
|
|||||||
assert_match "docker container prune --force --filter label=org.opencontainers.image.title=kamal-proxy on 1.1.1.1", output
|
assert_match "docker container prune --force --filter label=org.opencontainers.image.title=kamal-proxy on 1.1.1.1", output
|
||||||
assert_match "docker container prune --force --filter label=org.opencontainers.image.title=Traefik on 1.1.1.1", output
|
assert_match "docker container prune --force --filter label=org.opencontainers.image.title=Traefik on 1.1.1.1", output
|
||||||
assert_match "docker run --name kamal-proxy --network kamal --detach --restart unless-stopped --publish 80:80 --publish 443:443 --volume /var/run/docker.sock:/var/run/docker.sock --volume kamal-proxy:/root/.config/kamal-proxy --log-opt max-size=\"10m\" #{Kamal::Configuration::Proxy::DEFAULT_IMAGE} on 1.1.1.1", output
|
assert_match "docker run --name kamal-proxy --network kamal --detach --restart unless-stopped --publish 80:80 --publish 443:443 --volume /var/run/docker.sock:/var/run/docker.sock --volume kamal-proxy:/root/.config/kamal-proxy --log-opt max-size=\"10m\" #{Kamal::Configuration::Proxy::DEFAULT_IMAGE} on 1.1.1.1", output
|
||||||
assert_match "docker exec kamal-proxy kamal-proxy deploy app-web --target \"172.1.0.2:80\" --deploy-timeout \"6s\" --buffer-requests --buffer-responses --log-request-header \"Cache-Control\" --log-request-header \"Last-Modified\" on 1.1.1.1", output
|
assert_match "docker exec kamal-proxy kamal-proxy deploy app-web --target \"abcdefabcdef:3000\" --deploy-timeout \"6s\" --buffer-requests --buffer-responses --log-request-header \"Cache-Control\" --log-request-header \"Last-Modified\" on 1.1.1.1", output
|
||||||
|
|
||||||
assert_match "docker container stop kamal-proxy on 1.1.1.2", output
|
assert_match "docker container stop kamal-proxy on 1.1.1.2", output
|
||||||
assert_match "docker container stop traefik on 1.1.1.2", output
|
assert_match "docker container stop traefik on 1.1.1.2", output
|
||||||
@@ -37,8 +37,8 @@ class CliProxyTest < CliTestCase
|
|||||||
|
|
||||||
test "reboot --rolling" do
|
test "reboot --rolling" do
|
||||||
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
||||||
.with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-123$", "--quiet", "|", :xargs, :docker, :inspect, "--format", "'{{index .NetworkSettings.Networks.kamal.Aliases 0}}{{range $k, $v := .NetworkSettings.Ports}}{{printf \":%s\" $k}}{{break}}{{end}}'", "|", :sed, "-e", "'s/\\/tcp$//'")
|
.with(:docker, :container, :ls, "--all", "--filter", "name=^app-web-123$", "--quiet")
|
||||||
.returns("172.1.0.2:80")
|
.returns("abcdefabcdef")
|
||||||
.at_least_once
|
.at_least_once
|
||||||
|
|
||||||
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
SSHKit::Backend::Abstract.any_instance.expects(:capture_with_info)
|
||||||
|
|||||||
@@ -109,14 +109,14 @@ class CommandsProxyTest < ActiveSupport::TestCase
|
|||||||
|
|
||||||
test "deploy" do
|
test "deploy" do
|
||||||
assert_equal \
|
assert_equal \
|
||||||
"docker exec kamal-proxy kamal-proxy deploy service --target \"172.1.0.2:80\" --buffer-requests --buffer-responses --log-request-header \"Cache-Control\" --log-request-header \"Last-Modified\"",
|
"docker exec kamal-proxy kamal-proxy deploy service --target \"172.1.0.2:3000\" --buffer-requests --buffer-responses --log-request-header \"Cache-Control\" --log-request-header \"Last-Modified\"",
|
||||||
new_command.deploy("service", target: "172.1.0.2:80").join(" ")
|
new_command.deploy("service", target: "172.1.0.2").join(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "remove" do
|
test "remove" do
|
||||||
assert_equal \
|
assert_equal \
|
||||||
"docker exec kamal-proxy kamal-proxy remove service --target \"172.1.0.2:80\"",
|
"docker exec kamal-proxy kamal-proxy remove service --target \"172.1.0.2:3000\"",
|
||||||
new_command.remove("service", target: "172.1.0.2:80").join(" ")
|
new_command.remove("service", target: "172.1.0.2").join(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ proxy:
|
|||||||
enabled: true
|
enabled: true
|
||||||
hosts:
|
hosts:
|
||||||
- vm2
|
- vm2
|
||||||
|
port: 80
|
||||||
deploy_timeout: 2s
|
deploy_timeout: 2s
|
||||||
|
|
||||||
asset_path: /usr/share/nginx/html/versions
|
asset_path: /usr/share/nginx/html/versions
|
||||||
|
|||||||
Reference in New Issue
Block a user