簡體   English   中英

Docker映像openjdk:8-jdk-alpine無法執行簡單的命令

[英]Docker image openjdk:8-jdk-alpine fails to execute a simple command

我使用以下Dockerfile從openjdk:8-jdk-alpine創建了一個docker鏡像:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM