問題描述
在制作tars-node鏡像時,COPY項目源碼到鏡像中的命令沒有生效,啟動容器后進入,沒有看到拷貝的相關文件。
原因分析
COPY命令是常用的制作鏡像時拷貝文件到鏡像中的方式,沒有什么特殊的地方,命令如下:
看上去一切正常,但是進入容器后確實沒有看到對應的文件,
1、嘗試COPY另一個新文件到相應目錄上,還是沒有看到,
/data/tars/tasnode-date/這個目錄,是tars官方提供的tars相關數據目錄,懷疑是不是tars容器啟動時,依賴的基礎鏡像是不是還做了其他操作,比如重置這個目錄?
2、先驗證下是不是只是這個目錄無法COPY,
上圖中,在鏡像中新建了一個目錄,將兩個go文件COPY進去,
進入容器后,可以正常看到拷貝的文件,說明COPY失效問題確實只存在於/data/tars/tasnode-date/目錄。
3、查看了tars-node基礎鏡像的所有sh腳本,沒有發現做重置目錄的操作,講道理也沒什么動機去做這個目錄的重置。
4、回想起之前的一個問題,就是新起的mysql容器存在舊數據,當時的原因是新起的mysql容器,做了容器卷的映射,因為是復制粘貼的容器啟動命令,導致新mysql容器的數據和舊的一模一樣,
那么這次COPY命令不生效,是否是因為容器啟動后,/data/tars/tasnode-date/被映射到了宿主機的目錄,而宿主機目錄中不存在我們要拷貝的文件,所以出現這個情況?
查看tars-node啟動命令:
docker run -d \
--name=tars-node-auto \
--net=tars \
-e INET=eth0 \
-e WEB_HOST="http://172.25.0.3:3000" \
-e ENV="pt" \
-e SERVER_NAME="http" \
--ip="172.25.0.5" \
-v /data/logs/tars-node/:/data/tars/app_log/ \
-v /data/tars/data/tars-node/:/data/tars/tarsnode-data/ \
-v /etc/localtime:/etc/localtime:ro \
-p 9000-9010:9000-9010 \
tars-node-auto:v0.1
-v /data/tars/data/tars-node/:/data/tars/tarsnode-data/ \
確實。。啟動時將容器內的/data/tars/tarsnode-data/目錄映射到了宿主機的 /data/tars/data/tars-node/目錄,所以COPY命令是生效了,但是啟動容器時,又將該目錄映射,導致COPY的內容都消失了。
解決方案
刪除容器啟動命令中的/data/tars/tarsnode-data/目錄映射,
切記啟動容器時,要確認是否需要容器卷映射,否則很容易產生兩種問題:
1、存在舊數據
2、COPY的新文件消失