我在主机上创建了几个不同的目录,因为我试图了解Docker只是为了保持我的dockerfiles有条理。我刚刚运行的我的Dockerfile看起来像这样:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
我的实际转速仅为1 GB。但是当我尝试sudo docker build -t="crystal/test" .
时,我会将构建上下文发送到Docker守护程序3.5 GB。当你继续构建Docker镜像时,还有其他我不知道的东西吗?当我在主机上的其他目录中构建更多图像时,我的内存是否在累积?
答案 0 :(得分:158)
Docker客户端将整个“构建上下文”发送到Docker守护程序。该构建上下文(默认情况下)是Dockerfile
所在的整个目录(因此,整个rpms
树)。
您可以设置.dockerignore
文件以使Docker忽略某些文件。你可能想试试它。
或者,您可以将rpms
文件夹的一个目录级别移到Dockerfile
之上,只将符号链接test.rpm
移动到Dockerfile
的目录中。
答案 1 :(得分:14)
我通过将我的Dockerfile和docker-compose.yml移动到子文件夹来修复它,它运行得很好。显然,docker将当前文件夹发送到守护进程,我的文件夹是9演出。
答案 2 :(得分:5)
从Docker v18.06开始,可以使用名为Build Kit的新映像构建器。
它已与Docker预先捆绑在一起,无需安装任何东西。它与Dockerfile
语法向后兼容,无需更改Dockerfile
。
以下是在构建目录中构建具有大量未使用文件的映像的示例:
旧版Docker构建:
$ time docker image build --no-cache .
Sending build context to Docker daemon 4.315GB
[...]
Successfully built c9ec5d33e12e
real 0m51.035s
user 0m7.189s
sys 0m10.712s
新的Docker BuildKit:
$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
[...]
=> => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9 0.0s
real 0m0.166s
user 0m0.034s
sys 0m0.026s
唯一的变化是DOCKER_BUILDKIT=1
环境变量,时间差很大。
.dockerignore
文件请注意,.dockerignore
文件仍然有效。某些Dockerfile
命令,例如COPY . .
仍会考虑.dockerignore
规则。但是BuildKit不再将构建目录中的辅助文件(在Dockerfile
中未引用)复制为“构建上下文”。
答案 3 :(得分:3)
在我的情况下,当我执行错误的-f
参数时 - 没有找到Dockerfile的目录的路径
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- 右
docker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- 错误
答案 4 :(得分:3)
如果您有一个.dockerignore
文件,并且构建上下文仍然很大,则可以使用The Silver Searcher检查正在发送到docker构建上下文的内容:
ag --path-to-ignore .dockerignore --files-with-matches
请注意,某些**
模式可能无法正常工作。
有关其他评论,请参见此Github问题:https://github.com/moby/moby/issues/16056
答案 5 :(得分:1)
检查构建的 docker 镜像的好工具是 dive
https://github.com/wagoodman/dive
以下是官方自述文件中的说明:
要分析 Docker 镜像,只需使用镜像标签/id/digest 运行潜水:
dive <your-image-tag>
或者如果你想构建你的图像,然后直接进入分析它:
dive build -t <some-tag> .
答案 6 :(得分:0)
我和FreeStyler有同样的问题。但是我是从我的上下文中的目录构建的。所以-f参数是正确的,上下文不正确。
project
|
-------docker-dir
从docker-dir构建以下内容很好
docker build -t br_base:0.1 .
从dock-dir构建,构建上下文发生了变化。因此我需要更改命令中的上下文。上下文由&#39;。&#39;给出。在上面的命令中。
项目目录中的新命令应为
docker build -t br_base:0.1 ./base
这里的背景由&#39; ./ base&#39;
提供答案 7 :(得分:0)
如果您希望完全控制自己的构建上下文,则也可以完全构建容器,而无需任何上下文,并且随后将COPY
相关数据放入容器中。
docker build - < Dockerfile
此方法的一个缺点是,使用这种方法,您只能ADD
引用远程URL的dockerfile中的内容,而不能来自本地主机的文件。
请参见https://docs.docker.com/engine/reference/commandline/build/#build-with--
答案 8 :(得分:0)
如果您正在创建图像并收到消息 将构建上下文发送到docker daemon ,这需要花费日志时间进行复制,
然后添加 .dockerignore文件。它应该包括文件或目录 不需要复制。
答案 9 :(得分:0)
对于NodeJS Application
,在根项目目录中添加一个.dockerignore
文件,并在.dockerignore
文件中添加以下内容
node_modules
dist
答案 10 :(得分:-1)