问题描述


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

 

posted on 2021-11-26 18:55  Boom__Clap  阅读(3546)  评论(0编辑  收藏  举报