Golang == Ошибка: не удалось создать среду выполнения OCI: невозможно запустить процесс контейнера: exec: "./bin": stat ./bin: нет такого файла или каталога: неизвестно

Я пытаюсь создать этот файл Dockerfile для приложения Go, а затем развернуть его в GKE, но при создании модуля я увидел эту ошибку. Описывая этот модуль, я заметил ту же ошибку:

Ошибка: не удалось создать задачу контейнера: не удалось создать задачу прокладки: Ошибка создания среды выполнения OCI: ошибка создания среды выполнения: невозможно запустить процесс контейнера: exec: "./bin": stat ./bin: такого файла нет или каталог: неизвестен

Этот образ успешно запускается локально с помощью этой команды. docker run -it --rm bytecode01/domainalert:v2

#Dockerfile
FROM golang:alpine as builder
WORKDIR /data

COPY go.mod go.mod
RUN go mod download

# Copy the go source
COPY . .

# Build
RUN go build -a -o bin main.go

FROM alpine:latest

WORKDIR /data
COPY --from=builder /data/bin .
RUN chmod +x bin
CMD ["./bin"]

ГКЭ ПВХ успешно смонтирован

#pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: de
  labels:
    name: de
spec:
  containers:
    - name: de-pod
      image: bytecode01/domainalert:v2
      imagePullPolicy: Always
      volumeMounts:
        - mountPath: /data
          name: app-volume
  volumes:
    - name: app-volume
      persistentVolumeClaim:
        claimName: pvc-dynamic
#pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-dynamic
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi
  storageClassName: standard

Помогите решить мою проблему.

Как отметили в своем ответе DazWilkin, не следует давать название своей программе bin. Хотя это допустимое имя файла для программы, оно сбивает с толку. Когда я прочитал сводную строку вашего вопроса, я изначально предположил, что вы пытаетесь выполнить каталог bin, а не программу в этом каталоге.

Kurtis Rader 01.04.2024 04:55

На какой версии работает ваш GKE?

Nani 01.04.2024 10:05

1.27.8-gke.1067004 @Нани

Raj 01.04.2024 10:25

@Радж, спасибо за подтверждение. вы проверили код выхода модуля?

Nani 01.04.2024 10:32

Правильная работа только на локальном компьютере, проблема возникла при развертывании в GKE.@Nani.

Raj 01.04.2024 10:37
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
5
157
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш бинарный файл находится в ./data/bin:

# Working directory is /data
WORKDIR /data

# Copies from "builder" to "." (==WORKDIR=/data)
COPY --from=builder /data/bin .
RUN chmod +x bin

# Run from WORKDIR
CMD ["./bin"]

Затем вы устанавливаете на него ПВХ, эффективно удаляя его.

Решение состоит в том, чтобы поместить двоичный файл (или смонтировать PVC) в другом месте.

Я призываю вас рассмотреть:

  1. используя имя, отличное от mountPath: /data, для вашего двоичного файла. Хотя в данном случае это не вызывает проблемы, оно может создать проблемы и не является описательным.
  2. используя bin вместо ENTRYPOINT ["/path/to/you/binary"]. Это подробно задокументировано (включая Docker ENTRYPOINT).
FROM golang:alpine as builder
WORKDIR /data

COPY go.mod go.mod
RUN go mod download

# Copy the go source
COPY . .

RUN go build \
    -a \
    -o somethingdescriptive \
    main.go

FROM alpine:latest

COPY --from=builder /data/somethingdescriptive /bin

ENTRYPOINT ["/bin/somethingdescriptive"]

все та же ошибка kubectl logs pod/de -n domaintest exec /bin/deomainexpiry: ошибка формата exec @DazWilkin

Raj 01.04.2024 06:48

Кроме того, когда я пытаюсь запустить образ Docker, он запускается, но я получаю этот вывод, потому что каталог данных отсутствует, поэтому я сталкиваюсь с этой ошибкой. Error creating JSON file: open /data/SSLinfo.json: no such file or directory @DazWilkin

Raj 01.04.2024 07:00

Для однодвоичного приложения Go я бы также рассмотрел возможность размещения двоичного файла в «обычном» каталоге, например /usr/local/bin, чтобы вы могли просто использовать CMD ["somethingdescriptive"] без пути. (ИМХО, нет ничего плохого в CMD для команды основного контейнера.)

David Maze 01.04.2024 12:31

Попробуйте этот подход, но он все еще не работает. @DavidMaze

Raj 01.04.2024 17:09

Вы сказали «та же ошибка», но сообщили об «ошибке формата exec», но ранее ошибка была «Ошибка создания среды выполнения OCI». «Ошибка формата exec» предполагает, что вы создаете, например. для AMD64, но развертывается на узле ARM (или наоборот).

DazWilkin 01.04.2024 20:06

Я считаю, что это связано с проблемой, которая позже была описана в примечаниях к выпуску GKE здесь . Хотя в примечаниях к выпуску указано, что затронутые версии перечислены ниже (ваша — 1.27.8-gke.1067004), я считаю, что стоит проверить, отключив потоковую передачу изображений.

Для 1.27: 1.27.10-gke.1077000 и новее Для 1.28: Все версии 1.28. Для 1.29: Все версии 1.29.

Я изменил версию с 1.27.8-gke.1067004 на 1.28.7-gke.1026000. Я все еще сталкиваюсь с той же проблемой: exec /domainalert: ошибка формата exec. Проблема может быть в команде go build. @Нави

Raj 01.04.2024 11:22

Можно ли будет перейти на v1.27.11-gke.1061000 или выше.

Nani 01.04.2024 12:14

Все еще не работает @Нани

Raj 01.04.2024 14:16

Упс...!! Тогда это может быть «go build», как вы упомянули. Извините, я не мог быть более полезным.

Nani 01.04.2024 15:22
Ответ принят как подходящий

Решить проблему

Возникла проблема с командой сборки приложения Go. Сейчас я использую этот Dockerfile. и я добавил GOARCH=amd64 к команде.

FROM golang:latest AS build-stage

WORKDIR /data
COPY go.mod go.sum ./
RUN go mod download

COPY *.go ./

RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /domaintest

FROM alpine:latest AS build-release-stage

WORKDIR /data

COPY --from=build-stage /domaintest /bin

ENTRYPOINT ["/bin/domaintest"]

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