Docker容器/bin/bash?start.sh無法找到not?found問題解決
項目場景:
記一次Dockerfile構(gòu)建的Docker鏡像,啟動容器時sh: not found的問題
Dockerfile構(gòu)建的Docker鏡像,啟動容器時找不到start.sh,執(zhí)行docker run 命令時報錯:/bin/sh: 1: /data/server/start.sh: not found
問題描述
Dockerfile如下(腳本正確無內(nèi)容錯誤)
FROM openjdk:8 MAINTAINER it235.com # 環(huán)境sit/pro,由gradle傳入 ARG env ENV env ${env} WORKDIR /data/server #應(yīng)用包 COPY order.jar start.sh arthas-boot.jar /data/server/ RUN sh -c 'mkdir order' &&\ sh -c 'mkdir logs' &&\ sh -c 'mkdir order/gc' &&\ sh -c 'chmod -R 755 order/' &&\ sh -c 'chmod -R 755 logs/' &&\ sh -c 'chmod 755 start.sh' &&\ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone #啟動容器 ENTRYPOINT ["/bin/sh","-c","/data/server/start.sh ${env}"] EXPOSE 80
造成原因
造成這個問題的原因主要有以下幾點:
- docker中的文件夾沒有獲得權(quán)限
- start.sh文件不在指定的目錄下
- start.sh沒有權(quán)限
- build image時沒有把該腳本傳入
- start.sh文件中內(nèi)容錯誤
- start.sh中windows和unix的CRLF和LF的換行符問題
- start.sh本身換行符沒問題,但是提交Git后由于git的設(shè)置導(dǎo)致文件換行符發(fā)生變化
最終發(fā)現(xiàn)我這里是第6點問題,坑爹,這里針對以上6點分別給出解決方案。
解決方案
原因1:Dockerfile中給權(quán)限即可,我這里已經(jīng)授權(quán)
原因2:在啟動容器報錯后使用 docker cp 容器名稱:/data/server/start.sh ./
命名拷貝到本地宿主機目錄,如果能夠拷貝出來,說明文件位置正確
原因3:Dockerfile中給權(quán)限,給到最高777
原因4:排查方式同原因3,注意build image時時一定要在Dockerfile當前上下文中,maven和gradle項目可以用插件來做,可以看我的文檔進行,文檔地址看上面Dockerfile第2行
原因5:構(gòu)建鏡像之前,先自己在linux上運行下,保證內(nèi)容正確
原因6:這點和原因7一樣坑爹,一般情況下你根本不會考慮到這個問題,這個問題也非常好改,但是排查就要廢點心了。以IDEA編輯器為例
問題6我們是解決了,但是怎么排查出來是這個問題的呢,我們可以使用上述原因2的命令docker cp把start.sh從容器中拷貝出來(停止的容器也可以),然后使用命令cat -A start.sh
,如果你命令后面跟的是$美元符號,那么恭喜你,文件是LF換行的,如果跟的是^M$符號,那么不好意思,是CRLF換行符,以下2張圖給你做個對比。
原因7跟原因6一樣吧
好了,就到這里,做個小小的總結(jié),給個愛心讓更多小伙子看到吧
總結(jié)
到此這篇關(guān)于Docker容器/bin/bash start.sh無法找到not found問題解決的文章就介紹到這了,更多相關(guān)Docker容器/bin/bash start.sh無法找到內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker數(shù)據(jù)存儲之Bind mounts詳解
今天小編就為大家分享一篇關(guān)于Docker數(shù)據(jù)存儲之Bind mounts詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02詳解如何優(yōu)雅的給Docker配置網(wǎng)絡(luò)代理
有時因為網(wǎng)絡(luò)原因,比如公司 NAT,或其它啥的,需要使用代理,這篇文章主要為大家詳細介紹了如何優(yōu)雅的給Docker配置網(wǎng)絡(luò)代理,需要的小伙伴可以跟隨小編一起學習一下2024-01-01Docker基礎(chǔ)教程之Dockerfile語法詳解
這篇文章主要給大家介紹了關(guān)于Docker基礎(chǔ)教程之Dockerfile語法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Docker具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07