Не может запустить исполняемый файл jfrog из контейнера Alpine Linux
Я использую alpine linux
контейнер и конкретно python:3.4-alpine
а также openjdk:8-jdk-alpine
, Когда я пытаюсь выполнить любой скрипт или исполняемый файл, который я поместил в исполняемый файл, я получаю Not Found
ошибка.
Например. Когда в python:3.4-alpine
контейнер, который я хочу установить jfrog
Я следую за командой здесь (после установки curl
через apk). Эта команда загружает скрипт оболочки и передает его в sh, который загружает и создает jfrog
исполняемый файл с правильными разрешениями. Когда я пытаюсь запустить этот исполняемый файл, я получаю
bin/sh: ./jfrog: не найден
Обновить
Я обнаружил, что пользователь root использует bin/ash
по умолчанию, который я понятия не имею, что это такое. Итак, я призвал bin/sh jfrog
вручную, и я получаю
/ # bin/sh jfrog jfrog: строка 1: ELF: не найден jfrog: строка 1: синтаксическая ошибка: неопределенная строка в кавычках
Есть идеи, что я делаю не так? Я подозреваю, что это связано только с пользователем root, существующим в контейнере.
4 ответа
Я не уверен, но исполняемый файл jfrog динамически связан, и с ldd jfrog
ты получаешь:
ldd jfrog
/lib64/ld-linux-x86-64.so.2 (0x55ffb4c8d000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x55ffb4c8d000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x55ffb4c8d000)
Как вы можете видеть, у вас есть зависимости от libc, а Alpine поставляется с musl. Вы можете попробовать добавить apk add libc6-compat
но я не уверен, что это сработает
Проблема в том, что jfrog cli был скомпилирован с glibc, а в alpine linux только uclibc. Чтобы заставить его работать под alpine, это не тривиально, вы должны установить песочницу, которая больше, чем alpine env. https://wiki.alpinelinux.org/wiki/Running_glibc_programs
Другая возможность состоит в том, чтобы скомпилировать двоичный файл jfrog самостоятельно в alpine. Этот Dockerfile работал на меня.
FROM golang:alpine
WORKDIR /app/
RUN apk update && apk add git
# checkout the latest tag of jfrog cli
RUN mkdir -p /go/src/github.com/jfrogdev/jfrog-cli-go \
&& git clone https://github.com/JFrogDev/jfrog-cli-go /go/src/github.com/jfrogdev/jfrog-cli-go\
&& cd /go/src/github.com/jfrogdev/jfrog-cli-go \
&& git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
RUN GOOS=linux go get github.com/jfrogdev/jfrog-cli-go/jfrog
FROM alpine
COPY --from=0 /go/bin/jfrog /usr/bin/
ENTRYPOINT ["jfrog"]
Скрипт, который вы запускаете, начинается с:
#!/bin/bash
Bash не входит в альпийский по умолчанию. Вы можете установить его с помощью:
apk update && apk add bash
Обратите внимание, что Alpine довольно урезан по дизайну, поэтому могут быть и другие недостающие зависимости, которые вам нужно будет добавить, чтобы этот скрипт работал.
Может быть, слишком поздно, но это, вероятно, может помочь кому-то еще.
RUN curl -Lo /usr/bin/jfrog https://api.bintray.com/content/jfrog/jfrog-cli-go/\$latest/jfrog-cli-linux-386/jfrog?bt_package=jfrog-cli-linux-386 \
&& chmod a+x /usr/bin/jfrog