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

Car*_*iro 0 shell docker dockerfile

我正在使用私有 docker hub 存储库https://hub.docker.com/u/privaterepoexample/,之后我使用以下命令构建了我的 docker 映像:

\n\n
docker login\ndocker build -t privaterepoexample/sre:local .\ndocker tag 85cf9475bc1c privaterepoexample/sre\ndocker push privaterepoexample/sre\n
Run Code Online (Sandbox Code Playgroud)\n\n

docker build 的输出显示已login.sh添加到容器中:

\n\n
Executing busybox-1.29.3-r10.trigger\nOK: 85 MiB in 57 packages\nRemoving intermediate container 12fd67450dfc\n ---> e9ca0b9e4ac4\nStep 5/7 : WORKDIR /opt\n---> Running in ce881ede94aa\nRemoving intermediate container ce881ede94aa\n---> 2335b4f522ac\nStep 6/7 : ADD login.sh /opt\n---> 2aabf1712153\nStep 7/7 : CMD ["chmod 755 login.sh  && ./login.sh"]\n ---> Running in 8ec824d4e561\nRemoving intermediate container 8ec824d4e561\n ---> c97a4ad61578\nSuccessfully built c97a4ad61578\nSuccessfully tagged privaterepoexample/sre:local\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面的 Dockerfile 已成功构建,login.sh 添加成功:

\n\n
FROM ubuntu:16.04\n\n\nRUN apt-get update && apt-get install -y \\\ncurl\n\nFROM openjdk:8-jre-alpine\n\nRUN apk --no-cache add curl\n\n\nWORKDIR /opt\n\n\nADD login.sh /opt\n\n\nCMD ["chmod 755 login.sh  && ./login.sh"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我的问题来了,当我docker run像下面一样执行时,我收到错误:

\n\n
docker run -i privaterepoexample/sre \n\n 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: \nno such file or directory": unknown.\n
Run Code Online (Sandbox Code Playgroud)\n\n

但为什么它说没有这样的文件?当我进入 docker 容器时,我可以login.sh使用以下命令看到脚本:

\n\n
$ docker run -it   \nprivaterepoexample/sre /bin/sh\n/opt # ls\nlogin.sh\n/opt # cat login.sh \n#!/bin/sh\n# Black Box Tester!\ncontent=$(curl  --location --request POST  \n"https://api.platform.abc.com/auth/oauth/token" --header    \n\'Content-Type: application/x-www-form-urlencoded\' \\\n --header \'Authorization: Basic \' --data-raw \'grant_type=password&\nusername=event@abc.com&password=fJff\'| jq -r \n\'.domain_id\' )\n if [ $content = abc ]\n     then\n          echo \xe2\x80\x9cValid Login Token\xe2\x80\x9d\nelse\n          echo \xe2\x80\x9cinvalid url\xe2\x80\x9d\nfi\n/opt # exit\n
Run Code Online (Sandbox Code Playgroud)\n

Eri*_*kMD 6

您收到错误是因为您以意外的方式no such file or directory使用所谓的CMDin exec 形式。

\n\n

您可以Dockerfile通过多种方式修复您的问题,例如:

\n\n
    \n
  • 要么使用CMDshell 形式

    \n\n
    CMD chmod 755 login.sh && ./login.sh\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 或者保留CMDexec 形式(这通常是一个好主意),但确保 JSON 数组的第一个参数是程序,而不是复合命令。你可以通过运行来做到这一点chmod 755 \xe2\x80\xa6在构建时预先运行来执行此操作:

    \n\n
    ADD login.sh /opt\nRUN chmod 755 login.sh\nCMD ["./login.sh"]\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

CMD有关该命令及其兄弟命令的更多信息ENTRYPOINT,另请参阅其他答案:CMD does\t run after ENTRYPOINT in Dockerfile

\n