本站总访问量 Docker的一些问题 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

ADD和COPY异同

相同点:

  • ADD和COPY都支持将本地目录及文件复制到容器内指定目录和文件

不同点:

  • ADD支持从URL下载链接文件,不过下载的文件如果需要改变权限还需要另外一层RUN进行权限调整(默认是600)。如果源路径为一个tar压缩文件,压缩格式为gzip、bzip2以及xz的情况下,ADD会自动解压这个压缩文件到目标路径。
  • ADD指令会令镜像构建缓存失效,从而使镜像构建变得缓慢

所有文件复制均用COPY,仅在需要自动解压缩的时候使用ADD

docker build的机制

将Dockerfile转换为一个唯一的docker镜像

镜像的cache机制

一个Dockerfile构建多次,对于Dockerfile中的某一条指令并不会产生多个全新的镜像层。

docker buildcache机制 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启动时容器立刻退出的情况

评论