问题描述
在制作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的新文件消失