【问题标题】:How to include local libraries in build?如何在构建中包含本地库?
【发布时间】:2017-03-19 01:53:35
【问题描述】:

我有一个这样的目录结构:

app/
inc/
www/

其中inc/ 包含appwww 通用的代码。为我做的应用程序创建图像:

cd app
docker build .

所以构建的contextapp/ 的内容。当然,inc/ 中的代码会从应用程序中丢失,并且会中断

谷歌搜索我已经阅读了我应该阅读的建议:

docker build -f app/Dockerfile .

其中包括inc/(好),但也包括其他所有内容(坏),例如万维网

为了解决这个问题,我必须构建一个脚本,将inc/ 的内容复制到app/,执行构建和删除app/inc/。但这很麻烦,实际上,我不能这样做,因为我希望 docker-compose 进行构建。

推荐的管理方法是什么?

【问题讨论】:

  • 注意:2 年后,docker 19.03 应该可以帮助解决这个问题。见我的edited answer below

标签: docker docker-compose


【解决方案1】:

但也包括其他所有内容(坏的),例如万维网

这就是.dockerignore file 可以派上用场的地方:在其中声明www/

在 docker CLI 将上下文发送到 docker 守护程序之前,它会在上下文的根目录中查找名为 .dockerignore 的文件。
如果此文件存在,CLI 会修改上下文以排除与其中的模式匹配的文件和目录。

这有助于避免不必要地向守护程序发送大型或敏感文件和目录,并可能使用ADDCOPY 将它们添加到图像中。

包装 docker build 或 docker compose 以生成正确的 .dockerignore 现在是理想的选择。

最终,每个构建都应该能够指定自己的dockerignore 文件
issue 12886
然而:

此功能已暂停,等待正在研究/处理的其他更改;其中之一是在发送构建上下文时使构建器“更聪明”;见#31829


2019 年 8 月更新,两年后:issue 12886 (Add support for specifying .dockerignore file with -i/--ignore),2015 年开放,即将随 Docker 19.03 关闭:
Tõnis Tiigi 提及:

我认为我们可以关闭它,因为用例已在 19.03 中得到解决,并且这里有很多过时/不正确的建议可能会让新读者感到困惑。

这已通过三个功能解决:

  • #12886 (comment) 如果存储库包含许多 Dockerfile,则允许为每个 Dockerfile 设置一个 dockerignore 文件。 (请注意,这是对最初问题的准确描述)
  • BuildKit 会自动忽略不使用的文件,自动消除不同组文件需要相互忽略的问题。
  • 同一个 Dockerfile 对不同的构建“模式”(例如 dev 与 prod)使用不同的文件集的情况可以通过多阶段构建并使用构建参数定义模式更改来实现。

这与此处最初请求的语法不同,因为该版本与用户期望从 Dockerfiles 获得的稳定性保证不兼容。所提供的解决方案为需要更好地控制被忽略文件的用户解决了问题,而无需向其他文件添加新文件。

所以:

“先加载<dockerfile-name>.dockerignore,如果找不到则回退到.dockerignore”已登陆Docker(19.03.0-beta1)的测试分发版

需要开启BuildKit模式才能使用,例如:

$ export DOCKER_BUILDKIT=1

$ echo "FROM ubuntu \n COPY . tmp/" > Dockerfile
$ cp Dockerfile Dockerfile2
$ touch foo bar
$ echo "foo" > .dockerignore
$ echo "bar" > Dockerfile2.dockerignore

$ docker build -t container1 -f Dockerfile .
$ docker build -t container2 -f Dockerfile2 .

$ docker run container1 ls tmp
Dockerfile
Dockerfile2
Dockerfile2.dockerignore
bar
$ docker run container2 ls tmp
Dockerfile
Dockerfile2
Dockerfile2.dockerignore
foo

【讨论】:

  • 如果我这样做,我将无法构建 www/
  • @ekkis 为什么不呢?如果你进入wwwdocker build 那里,.dockerignore 文件在wwwparent 文件夹中创建将无关紧要。
  • 但您的建议是构建的上下文(父目录)是您放置.dockerignore 的位置。由于我将www/ 放入文件中,因此构建会复制所有 www,在构建app 时这很好,但在构建www 时却很糟糕(因为这也需要从父目录构建)
  • @ekkis 然后您需要将您的docker build 命令包装在一个脚本中,该脚本将生成正确的.dockerignore 文件,具体取决于您要构建的内容(appwww
  • 但正如我所提到的,我不能编写脚本,因为最终我的构建将由 docker-compose 完成
猜你喜欢
  • 1970-01-01
  • 2018-03-02
  • 2020-02-10
  • 2019-02-27
  • 1970-01-01
  • 2018-08-19
  • 2015-03-30
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多