How do I set the build output platform x86_64 in a Skaffold configuration?

11/9/2021

Since I'm developing on an M1 mac, my Docker builds will build ARM. I want to build x86_64 images which I know I can build with the --platform flag but I want to do that with my Skaffold configuration.

-- Ricky Kazuo Miller
kubernetes
skaffold

2 Answers

11/9/2021

Skaffold has buildCommand field to which you can pass a custom script.
So, for example

...
build:
  artifacts:
  - image: "foo"
    context: .
    custom:
      buildCommand: ./build.sh
...

build.sh

docker buildx build \
  --platform linux/amd64
  ... # any other flags

Disclaimer: Everything below is a speculation. I'm currently unable to test this, but I'm sure someone will correct me if I'm wrong.

There is also build.artifacts.docker field (currently in beta). It may be possible to use this field to pass arguments to Docker build.

...
build:
  artifacts:
  - image: "foo"
    context: .
    docker:
      dockerfile: <Dockerfile relative to workspace>
      target: <Dockerfile target name to build>
      buildArgs:
        platform: linux/amd64
  local:
    useDockerCLI: true #this is needed to use docker build CLI rather than Docker Engine API

It may also be required to set buildx as a default builder for Docker. This can be achieved with

docker buildx install
-- p10l
Source: StackOverflow

11/30/2021

Thanks to @p10l putting me on the right track, I was able to figure it out. Skaffold can't set the platform using the Docker Engine API, so we need to pass --platform=linux/x86_64 to the command line by setting useDockerCLI to true and adding cliFlags to our Docker configuration.

apiVersion: skaffold/v2beta26
kind: Config
build:
  # ... other unrelated config ...
  artifacts:
    - image: my-image
      context: ./
      docker:
        cliFlags:
          - --platform=linux/x86_64 
  local:
    useDockerCLI: true # the only way to set platform is with cliFlags so we need to enable the Docker CLI
-- Ricky Kazuo Miller
Source: StackOverflow