網站首頁 編程語言 正文
項目場景:
記一次Dockerfile構建的Docker鏡像,啟動容器時sh: not found的問題
Dockerfile構建的Docker鏡像,啟動容器時找不到start.sh,執行docker run 命令時報錯:/bin/sh: 1: /data/server/start.sh: not found
問題描述
Dockerfile如下(腳本正確無內容錯誤)
FROM openjdk:8 MAINTAINER it235.com # 環境sit/pro,由gradle傳入 ARG env ENV env ${env} WORKDIR /data/server #應用包 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中的文件夾沒有獲得權限
- start.sh文件不在指定的目錄下
- start.sh沒有權限
- build image時沒有把該腳本傳入
- start.sh文件中內容錯誤
- start.sh中windows和unix的CRLF和LF的換行符問題
- start.sh本身換行符沒問題,但是提交Git后由于git的設置導致文件換行符發生變化
最終發現我這里是第6點問題,坑爹,這里針對以上6點分別給出解決方案。
解決方案
原因1:Dockerfile中給權限即可,我這里已經授權
原因2:在啟動容器報錯后使用 docker cp 容器名稱:/data/server/start.sh ./
命名拷貝到本地宿主機目錄,如果能夠拷貝出來,說明文件位置正確
原因3:Dockerfile中給權限,給到最高777
原因4:排查方式同原因3,注意build image時時一定要在Dockerfile當前上下文中,maven和gradle項目可以用插件來做,可以看我的文檔進行,文檔地址看上面Dockerfile第2行
原因5:構建鏡像之前,先自己在linux上運行下,保證內容正確
原因6:這點和原因7一樣坑爹,一般情況下你根本不會考慮到這個問題,這個問題也非常好改,但是排查就要廢點心了。以IDEA編輯器為例
問題6我們是解決了,但是怎么排查出來是這個問題的呢,我們可以使用上述原因2的命令docker cp把start.sh從容器中拷貝出來(停止的容器也可以),然后使用命令cat -A start.sh
,如果你命令后面跟的是$美元符號,那么恭喜你,文件是LF換行的,如果跟的是^M$符號,那么不好意思,是CRLF換行符,以下2張圖給你做個對比。
原因7跟原因6一樣吧
好了,就到這里,做個小小的總結,給個愛心讓更多小伙子看到吧
總結
原文鏈接:https://blog.csdn.net/ron03129596/article/details/124832706
相關推薦
- 2021-12-11 Android?NDK開發(C語言字符串)_Android
- 2022-07-15 go學習筆記讀取consul配置文件詳解_Golang
- 2022-11-13 kvm?透傳顯卡至win10虛擬機的方法_Kvm
- 2022-04-05 C#反射調用拓展類方法實例代碼_C#教程
- 2022-09-25 引入DjangoRESTframework
- 2022-05-11 Python實現圖書管理系統設計_python
- 2022-09-23 flutter實現切換頁面緩存_Android
- 2022-05-01 React的三大屬性你都知道嗎_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支