Combine the two builders, as they are almost identical. The only difference was whether the platforms were set. The native cached builder wasn't using the context it created, so now we do. We'll set the driver to `docker-container` - it seems to be the default but the Docker docs claim it is `docker`.
85 lines
1.9 KiB
Ruby
85 lines
1.9 KiB
Ruby
class Kamal::Commands::Builder::Multiarch::Remote < Kamal::Commands::Builder::Base
|
|
def create
|
|
combine \
|
|
create_contexts,
|
|
create_local_buildx,
|
|
append_remote_buildx
|
|
end
|
|
|
|
def remove
|
|
combine \
|
|
remove_contexts,
|
|
super
|
|
end
|
|
|
|
def info
|
|
combine \
|
|
docker(:context, :ls),
|
|
docker(:buildx, :ls)
|
|
end
|
|
|
|
def push
|
|
docker :buildx, :build,
|
|
"--push",
|
|
*platform_options,
|
|
"--builder", builder_name,
|
|
*build_options,
|
|
build_context
|
|
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
|
|
"kamal-#{config.service}-multiarch-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
|
|
|
|
def platform_options
|
|
if local_arch
|
|
[ "--platform", "linux/#{local_arch}" ]
|
|
else
|
|
[ "--platform", "linux/amd64,linux/arm64" ]
|
|
end
|
|
end
|
|
end
|