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)