当我在windows 10上运行docker映像时。我得到这个错误:
standard_init_linux.go:190: exec user process caused "no such file or directory"
我的docker文件是:
FROM openjdk:8
EXPOSE 8080
VOLUME /tmp
ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh
# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl
# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]
脚本以#!开头/bin/sh
#!/bin/sh
set -e
JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"
if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi
exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar
尝试method1:
试着改变#!/bin/sh到#!/bin/bash但是得到同样的错误。
尝试method2:
docker文件中新增dos2unix
RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
我解决了一个类似的问题
我的配置:
—> Docker Desktop WSL 2后端—Windows
->需要CGO_ENABLED=1,因为我使用库编译了一个Kafka生产者
confluent-kafka-go.v1 /卡夫卡
我的docker映像已经构建成功,但当我使用docker-compose启动映像时,出现了同样的问题:
xxxxx:~/cp-all-in-one/cp-all-in-one-community# docker-compose up
Recreating ms-c3alert ... done
Attaching to ms-c3alert
ms-c3alert | standard_init_linux.go:211: exec user process caused "no such file or directory"
ms-c3alert exited with code 1
之后,在线程和另一个页面测试所有选项…我发现修复添加在go build句子-ldflags='-w -extldflags "-static"'
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags='-w -extldflags "-static"' -a -installsuffix cgo -o c3alert .
我解决了一个类似的问题
我的配置:
—> Docker Desktop WSL 2后端—Windows
->需要CGO_ENABLED=1,因为我使用库编译了一个Kafka生产者
confluent-kafka-go.v1 /卡夫卡
我的docker映像已经构建成功,但当我使用docker-compose启动映像时,出现了同样的问题:
xxxxx:~/cp-all-in-one/cp-all-in-one-community# docker-compose up
Recreating ms-c3alert ... done
Attaching to ms-c3alert
ms-c3alert | standard_init_linux.go:211: exec user process caused "no such file or directory"
ms-c3alert exited with code 1
之后,在线程和另一个页面测试所有选项…我发现修复添加在go build句子-ldflags='-w -extldflags "-static"'
RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags='-w -extldflags "-static"' -a -installsuffix cgo -o c3alert .
如果试图在从头开始的容器中运行动态链接的可执行文件,也会出现此错误。可执行文件将不能链接到共享库,并将报告一个(不是很有信息量)。"没有这样的文件或目录"错误。
让我们构建一个动态可执行测试:
cat <<EOF | g++ -x c++ - -o test
#include <iostream>
int main() {
std::cerr << "Hello!" << std::endl;
return 0;
}
EOF
这确实是一个动态可执行文件。运行ldd测试将报告如下内容(依赖于libc等):
linux-vdso.so.1 (0x00007ffd699fc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff570f7a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff570c76000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff570a5f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff5706c0000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff5714fe000)
现在,让我们用以前的可执行文件从头构建一个映像。Dockerfile将是:
FROM scratch
COPY test /
CMD [ "/test" ]
构建映像。然后,运行一个来自image的动态容器:
docker build . -t local/test
docker run --rm local/test
容器失败的退出码1,我得到:
standard_init_linux.go:219: exec user process caused: no such file or directory
这个问题是通过使用静态链接(在之前的gcc/g++ linker命令中使用-static flag)来解决的,它会生成一个独立的可执行文件。