我使用的是alpine linux
容器,具体为python:3.4-alpine
和openjdk:8-jdk-alpine
。当我尝试执行我在可执行文件中放置的任何脚本或可执行文件时,我得到Not Found
错误。
例如。在python:3.4-alpine
容器中我要安装jfrog
时,我按照命令here(在我通过apk安装curl
之后)。此命令下载shell脚本并将其管道为sh,下载并创建具有正确权限的jfrog
可执行文件。当我尝试运行此可执行文件时,我正在
bin / sh:./ jfrog:not found
更新
我发现root用户默认使用bin/ash
,我不知道它是什么。所以我手动调用了bin/sh jfrog
,我得到了
/ #bin / sh jfrog jfrog:第1行:ELF:未找到 jfrog:第1行:语法错误:未终止的引用字符串
知道我做错了什么吗?我怀疑它只与容器中存在的root用户有关。
答案 0 :(得分:6)
我不确定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
,但我不确定它是否可行
答案 1 :(得分:4)
问题是,jfrog cli是针对glibc而编译的,而alpine linux只提供了uclibc。要使它在高山下运行并不是微不足道的,你必须安装一个比那时更高的沙箱。 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"]
答案 2 :(得分:1)
您运行的脚本以:
开头#!/bin/bash
默认情况下,Bash不包含在alpine中。您可以使用以下命令安装它:
apk update && apk add bash
请注意,alpine在设计上相当简单,因此可能需要添加其他缺少的依赖项才能使此脚本正常工作。
答案 3 :(得分:0)
可能为时已晚,但这可能会对其他人有所帮助。
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