一次問(wèn)題調(diào)試刷新我對(duì)Docker文件系統(tǒng)的認(rèn)知

1、問(wèn)題描述

????????我用Dockerfile在Ubuntu環(huán)境中建造了一個(gè)名為hellojava的Docker鏡像,Dockerfile如下所示:

FROM openjdk:latest

CMD java -cp? Docker-1.0-SNAPSHOT.jar Docker.Application

????????其中Docker-1.0-SNAPSHOT.jar是與Dockerfile同目錄的jar包,Docker.Application是jar包中main方法所在類。當(dāng)運(yùn)行這個(gè)鏡像時(shí),計(jì)算機(jī)報(bào)"Error: Could not find or load main class Docker.Application",也就是無(wú)法找到或加載這個(gè)主類。我在本機(jī)中運(yùn)行這個(gè)命令就能成功執(zhí)行,但是在Docker中就不行。

2、問(wèn)題解決

? ? ? ? 我還以為是JDK版本和Docker的兼容性問(wèn)題,又陸續(xù)換了幾個(gè)JDK版本,但還是無(wú)法解決。后來(lái)我就將問(wèn)題歸結(jié)為路徑問(wèn)題,也就是在Docker的文件系統(tǒng)中無(wú)法中找到j(luò)ar包,因?yàn)槲以诒镜丨h(huán)境中特意輸錯(cuò)jar包的路徑也是報(bào)這個(gè)錯(cuò)誤。為了驗(yàn)證我的猜想,我重溫了Docker官網(wǎng)上的Dockerfile文件:


????????果不其然,官網(wǎng)的Dockerfile文件中有兩個(gè)關(guān)于目錄的配置:

WORKDIR:指定了Docker文件系統(tǒng)中的工作目錄。

ADD:該指令有兩個(gè)參數(shù),第一個(gè)是當(dāng)前文件系統(tǒng)中指定的目錄,第二個(gè)是Docker文件系統(tǒng)中的目錄。 該指令的意思是將當(dāng)前文件系統(tǒng)中指定目錄中的內(nèi)容拷貝到Docker文件系統(tǒng)中的指定目錄。

????????因此產(chǎn)生以上錯(cuò)誤的原因是沒(méi)有把當(dāng)前目錄上的jar包拷貝到Docker文件系統(tǒng)中,于是將本機(jī)中的jar包拷貝到Docker文件系統(tǒng),問(wèn)題就會(huì)迎刃而解了。

? ? ? ? 解決方法:參照官網(wǎng)的Dockerfile,在CMD命令前加上工作目錄,并將當(dāng)前文件系統(tǒng)中的jar包拷貝到工作目錄下:

FROM openjdk:last ? ?#使用已有鏡像作為父鏡像

WORKDIR /app ? ?#將Docker文件系統(tǒng)中的/app目錄設(shè)為工作目錄,當(dāng)執(zhí)行命令時(shí)默認(rèn)是在該目錄下執(zhí)行

ADD . /app ? ?#將當(dāng)前目錄下的文件拷貝到 Docker文件系統(tǒng)中的/app目錄

CMD java -cp? Docker-1.0-SNAPSHOT.jar Docker.Application ? ?#執(zhí)行命令

????????當(dāng)然還有一個(gè)命令可以實(shí)現(xiàn)拷貝功能,也就是COPY命令,將ADD命令改為COPY命令也可以解決該問(wèn)題。

3、總結(jié)

????????Docker文件系統(tǒng)是獨(dú)立于本機(jī)文件系統(tǒng)的,也就是說(shuō)運(yùn)行docker命令是在Docker文件系統(tǒng)中搜索文件,如果以本機(jī)文件系統(tǒng)中的指定路徑作為參數(shù),就無(wú)法找到文件。因此,必須將文件拷貝到Docker文件系統(tǒng)中,才可以找到該文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,848評(píng)論 15 147
  • 0. 前言 docker是什么?docker是用GO語(yǔ)言開發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)???..
    sessionboy閱讀 4,007評(píng)論 2 49
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 9,004評(píng)論 1 21
  • 感賞:我吸引到了帶孩子一起去省城讀書的高薪工作,明天去上班了! 感賞:這幾天婆婆來(lái)家里幫忙收拾用的東西! 感賞:我...
    非洲茉莉_8fb4閱讀 180評(píng)論 0 1
  • 七律 感懷 子雷 一葦凌波過(guò)索橋,屾山遙望水迢迢。 蒼煙叢里簫聲碎,殘照樓頭雁影飄。 笑看...
    子雷2017閱讀 506評(píng)論 0 18

友情鏈接更多精彩內(nèi)容