ADD和COPY异同
相同点:
- ADD和COPY都支持将本地目录及文件复制到容器内指定目录和文件
不同点:
- ADD支持从URL下载链接文件,不过下载的文件如果需要改变权限还需要另外一层RUN进行权限调整(默认是600)。如果源路径为一个tar压缩文件,压缩格式为gzip、bzip2以及xz的情况下,ADD会自动解压这个压缩文件到目标路径。
- ADD指令会令镜像构建缓存失效,从而使镜像构建变得缓慢
所有文件复制均用COPY,仅在需要自动解压缩的时候使用ADD
docker build的机制
将Dockerfile转换为一个唯一的docker镜像
镜像的cache机制
一个Dockerfile构建多次,对于Dockerfile中的某一条指令并不会产生多个全新的镜像层。
docker build 的 cache机制 Docker Daemnon通过Dockerfile构建新的镜像,发现新构建的镜像与某已有的镜像重复时,可以放弃构建新的镜像,而是选用已有的镜像作为结果,采取本地已经cache的镜像作为结果。
核心机制:遍历本地所有镜像,发现镜像与即将构建的镜像一致,将找到的镜像作为cache镜像,复用cache镜像作为构建结果。
ADD命令原则上不再使用cache。不过也有解决方案,就是将紧接着的文件计算出一个唯一的hash值,hash值未发生变化,可认为文件内容没有发生变化,可以使用cache机制。
docker进程启动就退出
- 查看日志和容器主进程退出码
- 检查容器日志
docker logs {容器号} - 如果看到了Exited(127)那就是由于内存超标导致的触发 Out Of Memory ,然后被强制终止,如果是Exited(0)表示容器主进程正常退出。
- 如果是执行后台服务程序的命令,Docker不是虚拟机,Docker启动的是进程,因此后台服务应该放到前台,可以直接启动应用。
- docker使用uwsgi时,如果在uwsgi.ini配置文件中指定了daemonize参数,容器的uwsgi应用的日志将会输出到指定的文件,进程在后台运行,而不是在前台运行,这样就造成通过docker run启动或者compose启动时容器立刻退出的情况