Ошибка формата 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. Он не использовал пакет
Проблема связана с тем, что 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, чтобы проверить код фиксации, который решил проблему.