docker build遇到的一个问题及解决办法

1,730 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

问题描述:

使用Dockerfile打包镜像的时候出现的问题

错误信息:

COPY failed: file not found in build context or excluded by .dockerignore: stat some/nginx/html: file does not exist

问题回顾:

使用docker build命令进行nginx的打包时,报错

使用的Dockerfile文件如下:

from nginx
COPY /some/nginx/html /usr/share/nginx/html

可以看到/some/nginx/html是一个根目录下的路径

使用的打包命令如下:

cd /opt/nginx
vim Dockerfile
# Dockerfile内容如上

docker build -t mynginx .

此时的docker build目录为 /opt/nginx.

问题解决:

经过排查,发现运行docker build命令的目录是/opt/nginx

而Dockerfile文件中COPY命令的目录是/some/nginx/html

所以找不到对应的目录/some/nginx/html

docker build目录最后指定的上下文目录为 . 即当前目录,所以COPY命令会从这个上下文目录为根目录去找文件,当然找不到了..

解决办法:

  1. 将COPY命令中的/some/nginx/html挪到上下文目录中即可
  2. 或者使用-f指定Dockerfile文件的路径,然后将上下文路径指定为/some/nginx/html即可

这两种解决办法其实是一种,只要上下文目录能够查询到COPY的目录就行

问题总结

其实看下COPY命令和docker build命令就可以解决问题

docker build命令中的最后一个参数就是当前目录也就是上下文,而上下文目录在Dockerfile的编译过程中有着重要的作用,比如不使用-f指定Dockerfile文件时,就会默认从此路径查询Dockerfile

COPY命令和ADD命令都会使用上下文路径进行文件的查找,所以如果从上下文路径找不到对应的文件,就会报本文中的错误.

通常情况下,应该使用一个空文件夹作为Dockerfile的编译目录,需要COPY或者ADD的文件/目录应放置在此目录下,然后将此目录作为docker build的上下文目录,同时也是Dockerfile的文件目录,这样就能避免像本文问题的发生.