docker build 報錯ADD failed: stat /var/lib/docker/tmp/docker-builder964944550/software/jdk8/jdk1.8.0_191: no such file or directory


Dokerfile

FROM centos:latest
MAINTAINER "lcy@qq.com"
ADD /software/jdk8/jdk1.8.0_191 /jdk/jdk1.8.0_191
ENV JAVA_HOME /jdk/jdk1.8.0_191
ENV PATH $PATH:$JAVA_HOME/bin

構建鏡像報錯如下:


root@iZwz9hb3esnbp5jod6mregZ:/data/dockerFiles# docker build -t centos_jdk8:base . -f Dockerfile
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos:latest
latest: Pulling from library/centos
6910e5a164f7: Pull complete
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
---> 831691599b88
Step 2/5 : MAINTAINER "lcy@qq.com"
---> Running in 32a4b625801c
Removing intermediate container 32a4b625801c
---> ca8f874eca03
Step 3/5 : ADD /software/jdk8/jdk1.8.0_191 /jdk/jdk1.8.0_191
ADD failed: stat /var/lib/docker/tmp/docker-builder964944550/software/jdk8/jdk1.8.0_191: no such file or directory

 經查閱網絡發現應該是如下原因

COPY 本機目錄  容器目錄

本機目錄不能使用絕對路徑,因為它本身就是一個相對路徑

本機目錄直接從當前目錄開始,所有需要復制的文件放在當前目錄

COPY test/1  /home/1

只會復制本機的1目錄下所有文件,而不會創建1目錄,所以后面需要指定

原文鏈接:https://blog.csdn.net/u010627840/java/article/details/103635038

然后ADD含有直接解壓的功能,所以將dockerfile文件修改為:主要修改點為復制tar包到當前目錄下,然后對應更改COPY 為ADD自動解壓到容器

FROM centos:latest
MAINTAINER "lcy@qq.com"
ADD jdk-8u191-linux-x64.tar.gz /jdk/
ENV JAVA_HOME /jdk/jdk1.8.0_191
#ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar(這一行不要也可)
ENV PATH $PATH:$JAVA_HOME/bin

鏡像構建成功


root@iZwz9hb3esnbp5jod6mregZ:/data/dockerFiles# docker build -t base . -f Dockerfile
Sending build context to Docker daemon 191.8MB
Step 1/5 : FROM centos:latest
---> 831691599b88
Step 2/5 : MAINTAINER "lcy@qq.com"
---> Running in 065bada3c33f
Removing intermediate container 065bada3c33f
---> 1b6a7d23e897
Step 3/5 : ADD jdk-8u191-linux-x64.tar.gz /jdk/
---> 577ac67983cc
Step 4/5 : ENV JAVA_HOME /jdk/jdk1.8.0_191
---> Running in 3b8b41547601
Removing intermediate container 3b8b41547601
---> 357b5f1c555f
Step 5/5 : ENV PATH $PATH:$JAVA_HOME/bin
---> Running in 98602b852681
Removing intermediate container 98602b852681
---> d095141b6cfa
Successfully built d095141b6cfa
Successfully tagged base:latest
root@iZwz9hb3esnbp5jod6mregZ:/data/dockerFiles# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
base latest d095141b6cfa 5 seconds ago 612MB

運行含有jdk的centos鏡像(注意一定要加 -it  否則起不來或者起來就停掉了)

docker run  -d -it --name=jdk base

進入容器java,javac均已經ok

 

 關於ADD和COPY的區別可以參考https://www.cnblogs.com/zdz8207/p/linux-docker-add-copy.html,如下:

docker Dockerfile指令ADD和COPY的區別,添加目錄方法

ADD指令的功能是將主機構建環境(上下文)目錄中的文件和目錄、以及一個URL標記的文件 拷貝到鏡像中。
其格式是: ADD 源路徑 目標路徑
#把當前config目錄下所有文件拷貝到/config/目錄下
ADD config/ /config/

ADD test1.txt test1.txt
ADD test1.txt test1.txt.bak
ADD test1.txt /mydir/
ADD data1 data1
ADD data2 data2
ADD zip.tar /myzip

有如下注意事項:
1、如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。
如果目標路徑不存在,則會自動創建目標路徑。

2、如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。
如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件;
如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。
如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。

3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。
如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。

4、如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。

----------------

ADD從一開始就是Docker 的一部分,並且支持一些傳統的技巧,而不僅僅是從build 上下文中復制文件。
ADD指令可以讓你使用URL作為<src>參數。當遇到URL時候,可以通過URL下載文件並且復制到<dest>。

ADD http://foo.com/bar.go /tmp/main.go
以上文件會通過制定的URL下載下來,並且添加到容器的文件系統中的/tmp/main.go路徑中。另外一種形式是讓你簡單地制定目的目錄為下載文件:

ADD http://foo.com/bar.go /tmp/
因為<dest>以 / 結尾。Docker 會從URL推斷文件名,並且添加到指定目錄。在這個案例中,一個名叫/tmp/bar.go的文件會被添加到容器的文件系統。

ADD的另外一個特性是有能力自動解壓文件。如果<src>參數是一個可識別的壓縮格式(tar, gzip, bzip2, etc)的本地文件(所以實現不了同時下載並解壓),就會被解壓到指定容器文件系統的路徑<dest>。
ADD /foo.tar.gz /tmp/
上述指令會使foo.tar.gz壓縮文件解壓到容器的/tmp目錄。
URL下載和解壓特性不能一起使用。任何壓縮文件通過URL拷貝,都不會自動解壓。

目前ADD指令有點讓人迷惑,有時候解壓文件,有時候不解壓文件,如果你想拷貝一個壓縮文件,你會以為地解壓。如果文件是某種不能識別的壓縮文件,如果你想解壓,你又會意外地復制它。
這種解釋似乎是ADD嘗試做的太多了,讓用戶有些疑惑。很明顯,沒人想要打破向后兼容性。所以決定新增一個行為更加明確的指令。

COPY和ADD相似,但是功能少一些。
在Docker 1.0發布時候,包括了新指令COPY。不像是ADD,COPY 更加直接了當,只復制文件或者目錄到容器里。
COPY不支持URL,也不會特別對待壓縮文件。如果build 上下文件中沒有指定解壓的話,那么就不會自動解壓,只會復制壓縮文件到容器中。
COPY是ADD的一種簡化版本,目的在於滿足大多數人“復制文件到容器”的需求。
Docker 團隊的建議是在大多數情況下使用COPY。拷貝文件的原則:使用COPY(除非你明確你需要ADD)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM