在许多页面和论坛中提供服务,但未找到解决方案。我有带有可执行.sh文件的简单docker容器。当我从Windows构建并运行它时-一切都很好。现在尝试从具有Docker 19.03.5版本的Ubuntu 18.04构建它。
对于重建,请使用以bash install.sh
执行的.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: cannot execute binary file
。
那里出了什么问题,我该如何解决?
UPD:
重命名的文件,它是二进制文件,结尾不应带有.sh。
然后再次尝试以下操作:
install.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
,它不起作用。
答案 0 :(得分:2)
我猜测错误消息会引起误解,真正的问题是Docker映像内部缺少某些库或其他Go运行时组件。尝试静态构建您的应用程序(这意味着它所需的所有内容都将捆绑到二进制文件中)。
CGO_ENABLED=0 go build -o myapp ./main
(是的,如果它不是shell脚本,请不要将其命名为main.sh
。Unix并不在乎,但是您会使您的读者感到困惑。实际上,请不要对其进行命名即使是这样,也不需要知道grep
是二进制文件,shell脚本还是Python程序;相同的约定对您自己的工具有意义。)