Ошибка формата Exec Go Cloud Code/Docker на M1 Mac

Я пытаюсь использовать код GoLand/Cloud для создания микросервиса Golang. Но я не могу понятьDockerfileприбиты.

      FROM --platform=linux/arm64 golang:1.20-alpine  AS build_base
RUN apk add --no-cache git

# Set the Current Working Directory inside the container
WORKDIR /tmp/wave-service

# We want to populate the module cache based on the go.{mod,sum} files.
COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

# Unit tests
# CGO_ENABLED=0 go test -v

# Build the Go app
RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o ./out/wave-service ./wave_microservice.go

# Start fresh from a smaller image
FROM --platform=linux/arm64 golang:1.20-alpine
RUN apk add ca-certificates

COPY --from=build_base /tmp/wave-service/out/wave-service /app/wave-service
RUN chmod a+x /app/wave-service

# This container exposes port 8080 to the outside world
EXPOSE 8080

# Run the binary program produced by `go install`
CMD ["/app/wave-service"] 

Возвращает ошибку

      Waiting for deployments to stabilize...
 - deployment/wave-service: container wave-service-container is backing off waiting to restart
    - pod/wave-service-565995d854-hwhsm: container wave-service-container is backing off waiting to restart
      > [wave-service-565995d854-hwhsm wave-service-container] exec /app/wave-service: exec format error 

Я пробовал экспериментировать с архитектурами и переменными ОС, но не могу понять, что здесь происходит.

РЕДАКТИРОВАТЬ:

скаффолд.yml

      apiVersion: skaffold/v4beta5
kind: Config
build:
  artifacts:
    - image: wave-service
      context: wave-service
      platforms: ["linux/amd64"]
      docker:
        dockerfile: Dockerfile

manifests:
  rawYaml:
    - k8s-pod.yaml 

k8s-pod.yaml

      apiVersion: v1
kind: Pod
metadata:
  name: wave-service
spec:
  containers:
    - name: wave-service
      image: wave-service 

2 ответа

Так что проблема была не в докере, а в моем основном файле go. Он не использовал пакеттак что go так и не нашел подходящую точку входа для компиляции. Изменение сработало!

Проблема связана с тем, что M1 Mac не позволяет развертывать образы, созданные дляamd64потому что они не совместимы сarm64.

Что вам нужно сделать, так это принудительно развернуть его с помощью сборочных пакетов. ПараметрtrustBuilder=trueинструктирует библиотеку пакетов доверять двоичному файлу жизненного цикла, находящемуся внутри образа компоновщика, монтируя учетные данные реестра в образ и позволяя ему выполнить экспорт образа. Таким образом, все пакеты сборки смогут видеть учетные данные.

В вашейskaffold.ymlфайл добавитьtrustBuilderвариант:

      build:
  artifacts:
    - image: wave-service
      buildpacks:
        builder: gcr.io/buildpacks/builder:v1
        trustBuilder: true

Для полноты картины я укажу на проблему GitHub, связанную с исправлением, добавленным в последние версии skaffold, чтобы проверить код фиксации, который решил проблему.

Другие вопросы по тегам