[英]Unable to run 'RUN ./mvnw dependency:go-offline -B' when building docker image from "openjdk:8-jdk-alpine" for Spring Boot app
[英]Docker image openjdk:8-jdk-alpine fails to execute a simple command
我使用以下Dockerfile從openjdk:8-jdk-alpine創建了一個docker鏡像:
但是,當我嘗試執行簡單的命令時,出現以下錯誤:
/bin/sh: ./run.sh: not found
我的run.sh看起來像這樣, 在這里輸入圖像描述,我嘗試“ docker run -it [images] bash”進入交互式環境,我可以看到文件“ run.sh”。在/ bin bash目錄中,但是我執行run.sh也會顯示“ / bin / sh:./run.sh:找不到”
PS:對不起,我英語不好,我是中國學生
run.sh的打印內容表明我的原始評估不正確; 但是根據錯誤消息和run.sh文件的圖像,我有幫助。
您的run.sh
腳本具有#!/bin/sh
的exec行,這意味着它不需要bash
即可運行,因此我之前的評估是錯誤的。
從Mac上開始,我創建了run.sh
腳本,並復制了dockerfile(主要是),並且該文件正確運行,從而產生了有效的運行。
然后,我將run.sh
轉換為使用dos行結尾,並得到以下信息:
$ file run.sh
run.sh: POSIX shell script text executable, ASCII text, with CRLF line terminators
$ docker run --rm -it bob
/bin/sh: ./run.sh: not found
它看起來很像你的錯誤消息。
由此,我會相信您的run.sh
文件包含dos行結尾。 根據圖像,我猜測您在Windows上,這是run.sh腳本問題的出處。
如何轉換行尾(一些示例):
dos2unix run.sh
perl -pi -e 's/\\r\\n/\\n/g' run.sh
造成此問題的最可能原因是run.sh
中的shebang行包含: #!/usr/bin/bash
或類似的東西-即它沒有引用將運行以下命令的二進制文件的有效路徑:外殼腳本。
在alpine上,bash安裝在/bin
,因此,如果您嘗試運行腳本,將會看到錯誤:
/ # ./run.sh
/bin/sh: ./run.sh: not found
/ # cat run.sh
#!/usr/bin/bash
echo "Hi"
解決方法(1):在apk添加bash之后,執行以下操作:
RUN ln -s /bin/bash /usr/bin
在您的Dockerfile中。 這將為bash創建一個符號鏈接,從而允許程序運行:
/ # ln -s /bin/bash /usr/bin
/ # ./run.sh
Hi
解決方法(2)-如果您不想進行這樣的符號鏈接,則可以始終將bash調用為CMD的一部分-
CMD [ 'bash', './run.sh' ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.