Car*_*iro 0 shell docker dockerfile
我正在使用私有 docker hub 存储库https://hub.docker.com/u/privaterepoexample/,之后我使用以下命令构建了我的 docker 映像:
docker login\ndocker build -t privaterepoexample/sre:local .\ndocker tag 85cf9475bc1c privaterepoexample/sre\ndocker push privaterepoexample/sre\nRun Code Online (Sandbox Code Playgroud)\n\ndocker build 的输出显示已login.sh添加到容器中:
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\nRun Code Online (Sandbox Code Playgroud)\n\n下面的 Dockerfile 已成功构建,login.sh 添加成功:
\n\nFROM 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"]\nRun Code Online (Sandbox Code Playgroud)\n\n现在我的问题来了,当我docker run像下面一样执行时,我收到错误:
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.\nRun Code Online (Sandbox Code Playgroud)\n\n但为什么它说没有这样的文件?当我进入 docker 容器时,我可以login.sh使用以下命令看到脚本:
$ 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\nRun Code Online (Sandbox Code Playgroud)\n
您收到错误是因为您以意外的方式no such file or directory使用所谓的CMDin exec 形式。
您可以Dockerfile通过多种方式修复您的问题,例如:
要么使用CMDshell 形式:
CMD chmod 755 login.sh && ./login.sh\nRun Code Online (Sandbox Code Playgroud)或者保留CMDexec 形式(这通常是一个好主意),但确保 JSON 数组的第一个参数是程序,而不是复合命令。你可以通过运行来做到这一点chmod 755 \xe2\x80\xa6在构建时预先运行来执行此操作:
ADD login.sh /opt\nRUN chmod 755 login.sh\nCMD ["./login.sh"]\nRun Code Online (Sandbox Code Playgroud)CMD有关该命令及其兄弟命令的更多信息ENTRYPOINT,另请参阅其他答案:CMD does\t run after ENTRYPOINT in Dockerfile
| 归档时间: |
|
| 查看次数: |
12340 次 |
| 最近记录: |