docker run无法运行shell脚本(未找到文件),尽管已使用docker build成功添加了shell脚本

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的输出,显示

我正在使用一个私有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的输出,显示添加到容器中的
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格式保留一个
    CMD
    (这通常是个好主意),但确保JSON数组的第一个参数是程序,而不是复合命令。您可以这样做,例如在构建时提前运行
    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格式保留一个
    CMD
    (这通常是个好主意),但确保JSON数组的第一个参数是程序,而不是复合命令。您可以这样做,例如在构建时提前运行
    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的
开始。