docker run无法运行shell脚本(未找到文件),尽管已使用docker build成功添加了shell脚本
我正在使用一个私有docker hub存储库docker run无法运行shell脚本(未找到文件),尽管已使用docker build成功添加了shell脚本,shell,docker,dockerfile,Shell,Docker,Dockerfile,我正在使用一个私有docker hub存储库https://hub.docker.com/u/privaterepoexample/,之后我使用以下命令构建了docker映像: docker login docker build -t privaterepoexample/sre:local . docker tag 85cf9475bc1c privaterepoexample/sre docker push privaterepoexample/sre docker build的输出,显示
https://hub.docker.com/u/privaterepoexample/
,之后我使用以下命令构建了docker映像:
docker login
docker build -t privaterepoexample/sre:local .
docker tag 85cf9475bc1c privaterepoexample/sre
docker push privaterepoexample/sre
docker build的输出,显示添加到容器中的login.sh
:
Executing busybox-1.29.3-r10.trigger
OK: 85 MiB in 57 packages
Removing intermediate container 12fd67450dfc
---> e9ca0b9e4ac4
Step 5/7 : WORKDIR /opt
---> Running in ce881ede94aa
Removing intermediate container ce881ede94aa
---> 2335b4f522ac
Step 6/7 : ADD login.sh /opt
---> 2aabf1712153
Step 7/7 : CMD ["chmod 755 login.sh && ./login.sh"]
---> Running in 8ec824d4e561
Removing intermediate container 8ec824d4e561
---> c97a4ad61578
Successfully built c97a4ad61578
Successfully tagged privaterepoexample/sre:local
下面的Dockerfile已成功生成并成功添加login.sh:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y \
curl
FROM openjdk:8-jre-alpine
RUN apk --no-cache add curl
WORKDIR /opt
ADD login.sh /opt
CMD ["chmod 755 login.sh && ./login.sh"]
现在我的问题来了,当我执行下面这样的docker run
时,我得到了错误:
docker run -i privaterepoexample/sre
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"chmod 755 login.sh && ./login.sh\": stat chmod 755 login.sh && ./login.sh:
no such file or directory": unknown.
但为什么它说没有这样的文件?当我进入docker容器时,我可以看到带有以下命令的login.sh
脚本:
$ docker run -it
privaterepoexample/sre /bin/sh
/opt # ls
login.sh
/opt # cat login.sh
#!/bin/sh
# Black Box Tester!
content=$(curl --location --request POST
"https://api.platform.abc.com/auth/oauth/token" --header
'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ' --data-raw 'grant_type=password&
username=event@abc.com&password=fJff'| jq -r
'.domain_id' )
if [ $content = abc ]
then
echo “Valid Login Token”
else
echo “invalid url”
fi
/opt # exit
您会得到错误
没有这样的文件或目录
,因为您正在以一种意外的方式使用所谓的
您可以通过多种方式修复Dockerfile
,例如:
- 使用shell格式的CMD:
CMD chmod 755 login.sh && ./login.sh
- 或者以exec格式保留一个
(这通常是个好主意),但确保JSON数组的第一个参数是程序,而不是复合命令。您可以这样做,例如在构建时提前运行CMD
:chmod 755…
ADD login.sh /opt RUN chmod 755 login.sh CMD ["./login.sh"]
有关
CMD
命令及其兄弟命令ENTRYPOINT
的更多信息,请参见另一个SO答案:您得到错误没有这样的文件或目录
,因为您以意外的方式使用了所谓的
您可以通过多种方式修复Dockerfile
,例如:
- 使用shell格式的CMD:
CMD chmod 755 login.sh && ./login.sh
- 或者以exec格式保留一个
(这通常是个好主意),但确保JSON数组的第一个参数是程序,而不是复合命令。您可以这样做,例如在构建时提前运行CMD
:chmod 755…
ADD login.sh /opt RUN chmod 755 login.sh CMD ["./login.sh"]
有关
CMD
命令及其兄弟命令ENTRYPOINT
的更多信息,请参见另一个SO答案:除了您的主要问题之外,请注意您的Dockerfile是次优的,因为它使用Docker的功能(即,您的Dockerfile中有几个FROM
),虽然您的用例似乎不需要此功能。因此,如果您不需要(Java)jre,您可能希望删除Dockerfile的前两行,并从openjdk:8-jre-alpine中的开始,甚至从alpine
中的开始(也就是说,您的Dockerfile中有几个来自
的),而您的用例似乎不需要此功能。因此,您可能希望删除Dockerfile的前两行,并从openjdk:8-jre-alpine
中的开始,如果您不需要(Java)jre,甚至可以从alpine的开始。