Я пытаюсь создать этот файл 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
Помогите решить мою проблему.
На какой версии работает ваш GKE?
1.27.8-gke.1067004 @Нани
@Радж, спасибо за подтверждение. вы проверили код выхода модуля?
Правильная работа только на локальном компьютере, проблема возникла при развертывании в GKE.@Nani.
Ваш бинарный файл находится в ./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) в другом месте.
Я призываю вас рассмотреть:
mountPath: /data
, для вашего двоичного файла. Хотя в данном случае это не вызывает проблемы, оно может создать проблемы и не является описательным.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
Кроме того, когда я пытаюсь запустить образ Docker, он запускается, но я получаю этот вывод, потому что каталог данных отсутствует, поэтому я сталкиваюсь с этой ошибкой. Error creating JSON file: open /data/SSLinfo.json: no such file or directory
@DazWilkin
Для однодвоичного приложения Go я бы также рассмотрел возможность размещения двоичного файла в «обычном» каталоге, например /usr/local/bin
, чтобы вы могли просто использовать CMD ["somethingdescriptive"]
без пути. (ИМХО, нет ничего плохого в CMD
для команды основного контейнера.)
Попробуйте этот подход, но он все еще не работает. @DavidMaze
Вы сказали «та же ошибка», но сообщили об «ошибке формата exec», но ранее ошибка была «Ошибка создания среды выполнения OCI». «Ошибка формата exec» предполагает, что вы создаете, например. для AMD64, но развертывается на узле ARM (или наоборот).
Я считаю, что это связано с проблемой, которая позже была описана в примечаниях к выпуску 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. @Нави
Можно ли будет перейти на v1.27.11-gke.1061000 или выше.
Все еще не работает @Нани
Упс...!! Тогда это может быть «go build», как вы упомянули. Извините, я не мог быть более полезным.
Решить проблему
Возникла проблема с командой сборки приложения 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"]
Как отметили в своем ответе DazWilkin, не следует давать название своей программе
bin
. Хотя это допустимое имя файла для программы, оно сбивает с толку. Когда я прочитал сводную строку вашего вопроса, я изначально предположил, что вы пытаетесь выполнить каталогbin
, а не программу в этом каталоге.