Не может запустить исполняемый файл 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

(Нажмите здесь для ссылки ссылки)

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