Load the hosts from the contexts before trying to build. If there is no context, we'll create one. If there is one but the hosts don't match we'll re-create. Where we just have a local context, there won't be any hosts but we still inspect the builder to check that it exists.
62 lines
1.5 KiB
Ruby
62 lines
1.5 KiB
Ruby
class Kamal::Commands::Builder::Multiarch::Remote < Kamal::Commands::Builder::Multiarch
|
|
def create
|
|
combine \
|
|
create_contexts,
|
|
create_local_buildx,
|
|
append_remote_buildx
|
|
end
|
|
|
|
def remove
|
|
combine \
|
|
remove_contexts,
|
|
super
|
|
end
|
|
|
|
def context_hosts
|
|
chain \
|
|
context_host(builder_name_with_arch(local_arch)),
|
|
context_host(builder_name_with_arch(remote_arch))
|
|
end
|
|
|
|
def config_context_hosts
|
|
[ local_host, remote_host ].compact
|
|
end
|
|
|
|
private
|
|
def builder_name
|
|
super + "-remote"
|
|
end
|
|
|
|
def builder_name_with_arch(arch)
|
|
"#{builder_name}-#{arch}"
|
|
end
|
|
|
|
def create_local_buildx
|
|
docker :buildx, :create, "--name", builder_name, builder_name_with_arch(local_arch), "--platform", "linux/#{local_arch}"
|
|
end
|
|
|
|
def append_remote_buildx
|
|
docker :buildx, :create, "--append", "--name", builder_name, builder_name_with_arch(remote_arch), "--platform", "linux/#{remote_arch}"
|
|
end
|
|
|
|
def create_contexts
|
|
combine \
|
|
create_context(local_arch, local_host),
|
|
create_context(remote_arch, remote_host)
|
|
end
|
|
|
|
def create_context(arch, host)
|
|
docker :context, :create, builder_name_with_arch(arch), "--description", "'#{builder_name} #{arch} native host'", "--docker", "'host=#{host}'"
|
|
end
|
|
|
|
def remove_contexts
|
|
combine \
|
|
remove_context(local_arch),
|
|
remove_context(remote_arch)
|
|
end
|
|
|
|
def remove_context(arch)
|
|
docker :context, :rm, builder_name_with_arch(arch)
|
|
end
|
|
end
|