gam*_*r17 44 docker dockerfile docker-for-windows
当我在Windows 10上运行我的docker镜像时,我收到此错误:
standard_init_linux.go:190: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)
我的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"]
Run Code Online (Sandbox Code Playgroud)
并且脚本以#!/ 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
Run Code Online (Sandbox Code Playgroud)
尝试方法1: 尝试将#!/ bin/sh更改为#!/ bin/bash,但得到相同的错误.
尝试方法2:在docker文件中添加了dos2unix
RUN apt-get install -y dos2unix
RUN dos2unix /run.sh
Run Code Online (Sandbox Code Playgroud)
Vik*_*ore 69
使用notepad ++,转到编辑 - > EOL转换 - >从CRLF更改为LF.
aru*_*net 50
假设您在 alpine 容器中运行 go 二进制文件时遇到了这个问题。在构建 bin 之前导出以下变量
# CGO has to be disabled for alpine
export CGO_ENABLED=0
Run Code Online (Sandbox Code Playgroud)
然后 go build
小智 42
改变入口点如下.它对我有用
ENTRYPOINT ["sh","/run.sh"]
Run Code Online (Sandbox Code Playgroud)
Ami*_*Dev 12
这是一个 CRLF 问题。我用这个解决了这个问题:
git config --global core.eol lf
git config --global core.autocrlf input
find . -type f -print0 | xargs -0 dos2unix
Run Code Online (Sandbox Code Playgroud)
daB*_*bby 11
使用alpine图像时,我遇到了同样的问题。
我的.sh文件具有以下第一行:
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
高山没有重击。因此将线更改为
#!/bin/sh
Run Code Online (Sandbox Code Playgroud)
或安装bash
apk add --no-cache bash
Run Code Online (Sandbox Code Playgroud)
为我解决了这个问题。
BMi*_*tch 11
“没有这样的文件或目录”来自 Linux,我看到了以下原因:
第一个原因实际上是在容器中没有文件。有些人尝试从主机运行命令而不将其添加到他们的图像中。有些人通过在他们想要运行的命令之上安装一个卷来隐藏他们的命令。如果您运行相同的容器,但使用 shell 而不是您的正常入口点/cmd 值,然后运行ls /path/to/cmd您会看到它是否存在。
下一个原因是运行错误的命令。这通常与 json/exec 格式的命令一起出现,该命令无法正确解析。如果您看到尝试运行的命令["app",或类似的命令,则 Docker 未解析 json 字符串,并且 Linux 正在尝试使用 shell 将命令解析为字符串。如果您对 args 进行了错误排序,也会发生这种情况,例如,尝试运行-it是您尝试在图像名称之后放置标志的标志,而它们必须放置在图像名称之前。
对于 shell 脚本,如果第一行#!指向容器内不存在的命令,则会出现此错误。对于某些人来说,这是试图bash在只有/bin/sh. 在您的情况下,这可以来自脚本中的 Windows 换行符。在您的编辑器中切换到 Linux/Unix 换行符将纠正这一点。
对于二进制文件,如果缺少链接库,则会出现此错误。当使用 编译的 Go 命令时,我经常看到这种情况libc,但在 alpine 上运行时使用musl或从头开始,根本没有任何库。您需要包含所有缺少的库或静态编译您的命令。要查看这些库链接,请ldd /your/app在您的二进制文件上使用。
请注意类似的错误,例如:
standard_init_linux.go:211: exec user process caused "no such file or directory"
Run Code Online (Sandbox Code Playgroud)
如果构建映像的架构与您的系统不匹配,则可能会发生这种情况。例如,尝试arm64在x86_64机器上运行构建的映像可能会产生此错误。
我正在构建一个Go应用程序,这些答案对我来说都是错误的,所以我想分享我的解决方案。对我来说,我有一个与 Windows 无关的 Dockerfile(在 Mac 上编码,尽管在 macOS 11 上的一个和 macOS 12 上的另一个之间共享。不过行结尾是相同的)。
对我来说,解决方案最终是我需要将应用程序构建为静态链接的二进制文件,无需外部依赖即可运行。我正在为 Go 应用程序构建 Dockerfile,该应用程序首先构建在 Go 构建器映像中,然后构建在临时映像中。为了让我的二进制文件能够从头开始运行,我必须添加该CGO_ENABLED=0 标志。有关此 Reddit 页面的更多信息:https://www.reddit.com/r/golang/comments/pi97sp/comment/hbo0fq6/ ?utm_source=share&utm_medium=web2x&context=3
我的代码最终有效:
############################
# STEP 1 build optimized executable binary
############################
FROM golang:1.16-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o cl-api
############################
# STEP 2 build a small image
############################
FROM scratch
COPY --from=builder /app/cl-api /
EXPOSE 8000
ENTRYPOINT ["/cl-api"]
Run Code Online (Sandbox Code Playgroud)
使用 Notepad++ 用 LF 替换 CRLF
重新构建并运行 docker 镜像应该可以解决您的问题。
| 归档时间: |
|
| 查看次数: |
40505 次 |
| 最近记录: |