Ошибка выполнения Gitlab Runner: «sh»: исполняемый файл не найден в $ PATH

avatar
Roy
9 августа 2021 в 06:23
1166
3
1

Эта ошибка возникает при запуске контейнера в Gitlab CI

ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "sh": executable file not found in $PATH: unknown (exec.go:57:0s)

Мой .Dockerfile

FROM golang:1.16-alpine AS builder
ENV \
    OUTDIR='/out' \
    GO111MODULE='on'    

WORKDIR /app
COPY go.mod /app/
COPY go.sum /app/
RUN go mod download
COPY . /app/
RUN CGO_ENABLED=0 GOBIN=${OUTDIR}/usr/bin/ go install .

FROM scratch
COPY --from=builder /out/ /
ENTRYPOINT ["/usr/bin/app-cli"]

Мой .gitlab-ci.yml

stages:
  - validation

validation:
  image:
    name: gitlab.mycompany.net:4567/myteam/app-cli:latest
    entrypoint: [""]
  stage: validation
  rules:
    - if: '$CI_MERGE_REQUEST_IID'
  script:
    - ls

Эта ошибка связана с моим dockerfile или gitlab ci?

Я могу запустить это локально с помощью docker run --rm -ti gitlab.mycompany.net:4567/myteam/app-cli:latest но не в gitlab runner

Источник

Ответы (3)

avatar
Roy
9 августа 2021 в 08:58
0

нашел ответ

Мне просто нужно изменить FROM scratch в FROM alpine:latest так что теперь я могу использовать sh

TheQueenIsDead
12 августа 2021 в 02:22
0

Ничего не устанавливается с нуля, это самый маленький минимальный контейнер, который вы можете иметь, поэтому он не поставляется с ОС или оболочкой.

avatar
izolight
9 августа 2021 в 08:31
0

Помимо перезаписи точки входа, как уже было указано, проблема заключается в том, что вы вызываете ls как сценарий, для которого требуется оболочка. Попробуйте просто вызвать ваше приложение в части скрипта /usr/bin/app-cli.

Roy
9 августа 2021 в 08:38
1

значит ли это, что я не могу запустить ls, cat и т. д.?

Roy
9 августа 2021 в 08:43
0

Я пробовал это, и он возвращает эту ошибку Ошибка: неизвестная команда «sh» для «app-cli»

izolight
9 августа 2021 в 10:51
0

Похоже, что часть сценария всегда запускается в оболочке, поэтому использование с нуля не сработает.

avatar
Kamol Hasan
9 августа 2021 в 06:50
1

Giving an empty entrypoint и not giving the entrypoint at all не одно и то же.

В команде docker run вы не указываете точку входа. Следовательно, образ Docker запускается с точкой входа по умолчанию ENTRYPOINT ["/usr/bin/app-cli"].<53365557879590>.

В gitlab-ci вы перезаписываете точку входа по умолчанию пустой entrypoint: [""], где executable file not found.

Попробуйте это:

validation:
  image:
    name: gitlab.mycompany.net:4567/myteam/app-cli:latest
    entrypoint: ["/usr/bin/app-cli"]

Roy
9 августа 2021 в 07:09
0

Я пробовал это, и он возвращает эту ошибку Error: unknown command "sh" for "app-cli"

Peter
9 августа 2021 в 08:11
0

@Roy, правило, вероятно, оценивается в контейнере и поэтому требует оболочки (которой, очевидно, нет на пустом месте). Выведите оставшиеся аргументы для проверки.

Roy
9 августа 2021 в 08:33
0

«Выведите оставшиеся аргументы для проверки», не могли бы вы уточнить, как это сделать, @Peter?

Peter
9 августа 2021 в 15:51
0

@Roy, сделай вывод app-cli os.Args.