3

我正在使用一个alpine linux容器,特别是python:3.4-alpineopenjdk:8-jdk-alpine. 当我尝试执行我放置在可执行文件中的任何脚本或可执行文件时,我得到Not Found错误。

例如。在python:3.4-alpine我要安装的容器中时,jfrog我按照此处的命令(curl通过 apk 安装之后)。此命令下载一个 shell 脚本并将其通过管道传送到 sh,后者下载并创建jfrog具有正确权限的可执行文件。当我试图运行这个可执行文件时,我得到了

bin/sh: ./jfrog: 未找到

更新

我发现bin/ash默认情况下使用的是root用户,我不知道它是什么。所以我bin/sh jfrog手动调用,我得到

/# bin/sh jfrog jfrog: line 1: ELF: not found jfrog: line 1: 语法错误:未终止的引号字符串

知道我做错了什么吗?我怀疑它只与容器中存在的 root 用户有关。

4

4 回答 4

9

我不确定,但 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,但我不确定它是否会起作用

于 2017-04-04T14:53:11.933 回答
4

问题是,jfrog cli 是针对 glibc 编译的,而 alpine linux 只提供 uclibc。为了让它在 alpine 下运行它不是微不足道的,你必须安装一个比 alpine env 更大的沙箱。https://wiki.alpinelinux.org/wiki/Running_glibc_programs

另一种可能性是在 alpine 中自己编译 jfrog 二进制文件。这个 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"]
于 2017-09-28T07:55:53.650 回答
1

您正在运行的脚本以:

#!/bin/bash

Bash 默认不包含在 alpine 中。您可以使用以下方式安装它:

apk update && apk add bash

请注意,alpine 在设计上相当精简,因此您可能需要添加其他缺失的依赖项才能使此脚本正常工作。

于 2017-04-04T14:51:38.613 回答
1

可能为时已晚,但这可能对其他人有帮助。

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

(点击这里查看参考链接)

于 2018-08-10T20:49:52.750 回答