bash - Docker/bin/sh 未找到二进制 go 文件

标签 bash docker go

提供了许多页面和论坛,但没有找到解决方案。我有一个带有可执行 .sh 文件的简单 docker 容器。当我从 Windows 构建并运行它时,一切都很好。现在尝试使用 Docker 版本 19.03.5 从 Ubuntu 18.04 构建它。

为了重建,使用 .sh 脚本,我将其作为 bash install.sh

执行
go build -o main.sh ./main

docker stop stats
docker container rm stats
docker image rm stats
docker build -t stats .
docker run --name stats -p 8080:8080 stats

我的 Dockerfile 是:

FROM alpine:3.10.1

ARG appPath="app"

RUN mkdir /app/
COPY main.sh /app/main.sh
RUN chmod +x /app/main.sh
COPY resources  /app/resources

RUN apk add --no-cache bash
WORKDIR /app

EXPOSE 8080
CMD /bin/bash -c 'ls' && /app/main.sh dev

输出“安装”调用如下:

bash install.sh
stats
stats
Untagged: stats:latest
Sending build context to Docker daemon  38.98MB
Step 1/10 : FROM alpine:3.10.1
 ---> b7b28af77ffe
Step 2/10 : ARG appPath="app"
 ---> Using cache
 ---> 08baa7336701
Step 3/10 : RUN mkdir /app/
 ---> Using cache
 ---> fb9870e78322
Step 4/10 : COPY main.sh /app/main.sh
 ---> Using cache
 ---> 79bf713855e3
Step 5/10 : RUN chmod +x /app/main.sh
 ---> Using cache
 ---> 88bf70f9c6ec
Step 6/10 : COPY resources  /app/resources
 ---> Using cache
 ---> 2ebf95627a9e
Step 7/10 : RUN apk add --no-cache bash
 ---> Using cache
 ---> 39cd823e7f2f
Step 8/10 : WORKDIR /app
 ---> Using cache
 ---> 37e6fcea2d65
Step 9/10 : EXPOSE 8080
 ---> Using cache
 ---> 4250094c65f6
Step 10/10 : CMD /bin/bash -c 'ls' && /app/main.sh dev
 ---> Using cache
 ---> ed41a1efb15b
Successfully built ed41a1efb15b
Successfully tagged stats:latest
main.sh
resources
/bin/sh: /app/main.sh: not found

我不明白出了什么问题。 main.sh 就在那里。如果我尝试执行 CMD/bin/bash -c 'ls' && bash main.sh dev 然后收到 main.sh: main.sh: 无法执行二进制文件

哪里出了问题,我该如何解决?

更新:

已重命名文件,该文件是二进制文件,最后不应包含 .sh。

并再次尝试以下操作:

安装.sh

#!/bin/bash
go build -o myapp ./main

docker stop stats
docker container rm stats
docker image rm stats
docker build -t stats .
docker run --name stats -p 8080:8080 stats

Dockerfile

FROM alpine:3.10.1

RUN mkdir /app/
COPY myapp /app/myapp
RUN chmod +x /app/myapp
COPY resources  /app/resources

RUN apk add --no-cache bash
WORKDIR /app

EXPOSE 8080
CMD /bin/bash -c 'ls' && ./myapp dev

输出如下:

....    
Step 9/9 : CMD /bin/bash -c 'ls' && ./myapp dev
 ---> Running in 52fc24d26747
Removing intermediate container 52fc24d26747
 ---> 8d4f415e6dcd
Successfully built 8d4f415e6dcd
Successfully tagged stats:latest
myapp
resources
/bin/sh: ./myapp: not found

尝试了 /app/myapp./myapp 但不起作用。

最佳答案

我猜测错误消息具有误导性,真正的问题是 Docker 镜像中缺少某些库或其他 Go 运行时组件。尝试静态构建您的应用程序(这意味着它需要的所有内容都将捆绑到二进制文件中)。

CGO_ENABLED=0 go build -o myapp ./main

(是的,如果它不是 shell 脚本,请不要将其称为 main.sh。Unix 不在乎,但你会让人类读者感到困惑。实际上,即使是,也不要这样调用它。您不需要知道 grep 是二进制文件、shell 脚本还是 Python 程序;相同的约定对于您自己的工具有意义。 )

关于bash - Docker/bin/sh 未找到二进制 go 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59233855/

相关文章:

bash - sh : . ..: 在尝试使用 plink 调用 shell 脚本时不是标识符

docker - 默认情况下未启用容器监视

ruby-on-rails - Docker 依赖问题 : Rake aborted! LoadError: cannot load such file -- sqlite3/sqlite3_native

sockets - golang unix 套接字错误。调用 : resource temporarily unavailable

unit-testing - 如何对使用适用于 Go V2 的 AWS 开发工具包实现的 Lambda 进行单元测试

bash - "source"shell 脚本中的命令不起作用

windows - 错误 : ionice: ioprio_set failed: Invalid argument (while trying to build custom ROM on bash Ubuntu in Windows 10)

MongoDB 构建 Docker 镜像时无法运行测试 - 服务器选择错误 : server selection timeout

algorithm - 对于唯一的整数数组,什么是好的散列函数(或类似函数)?

windows - 如何在 Windows 10 Ubuntu bash (WSL) 上使用 difftool 和 mergetool