问题标签 [docker-multi-stage-build]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
docker - Docker多阶段构建不在阶段之间复制
我正在尝试创建一个多阶段构建,其中第一阶段为主题安装纱线,第二阶段为 Drupal 设置 PHP 环境。
当我查看输出时,看起来 yarn install 正在运行,但COPY
底部附近的命令并未将其复制到 PHP 映像中。如果我是对的,那么应该在我的本地机器上创建 node_modules 目录吗?
码头工人-compose.yml:
Dockerfile:
docker - Docker 组合和外部图像多阶段构建
我使用Docker multi-stage build,具体来说:
使用外部图像作为“舞台”</h3>
使用多阶段构建时,您不仅限于从之前在 Dockerfile 中创建的阶段进行复制。您可以使用 COPY --from 指令从单独的映像复制,可以使用本地映像名称、本地或 Docker 注册表上可用的标记或标记 ID。如有必要,Docker 客户端会拉取映像并从那里复制工件。语法是:
就我而言,我有三个 Docker 文件。
一个 Dockerfile 只定义了一个图像,我将其用作构建阶段以在其他两个 Dockerfile 之间共享:
并假设我构建了上面的 Dockerfile 给出:
docker build -t my-shared-build -f path/to/shared/Dockerfile .
所以现在我有一个my-shared-build
在两个容器之间共享的图像,它们的 dockerfile 看起来像:
我可以构建和运行它们。
回顾一下,我目前所做的是:
1) 构建共享镜像 2) 构建进程一镜像 3) 构建进程二镜像
现在我可以运行“进程一”和“进程二”容器。
问题
现在我想使用 Docker Compose 来自动执行“进程一”和“进程二”。
所以问题是:如何在 Docker Compose 中指定我需要首先构建共享映像,然后构建其他映像(然后运行它们的容器)?
docker - 在同一容器中为 python 和 nodejs 多阶段构建
npm
我需要在同pipenv
一个容器中访问两者。我认为实现这一目标的最佳方法是使用多阶段构建。
如果我做这样的事情:
如何确保pipenv
二进制文件不被丢弃?我需要从上一阶段复制哪些文件才能使 pipenv 在最终图像中可用?
php - Docker:如何在多个容器/服务之间共享相同的应用程序代码(例如 PHP-FPM 和 NGINX)
tl;博士
- 应用程序代码需要一个构建步骤(引入依赖项)
- 多个容器需要相同的“构建”代码
问:使用 docker / docker-compose 存档的好的策略/工作流程是什么?
长
我们正在使用多个组件(容器/服务)对 PHP 应用程序进行 dockerizing,例如
- 工作节点(PHP 进程通过主管保持活动状态)
- 调度程序(管理工作人员并在 cron 中运行重复任务)
- PHP-FPM/Nginx(网页界面)
这些服务在 docker-compose 文件中定义。在开发过程中,我们通过卷从每个容器的主机上的目录中挂载应用程序代码,以便我们“立即”看到每个服务中的更改(示例)。生活很好。
我们现在正在建立一个基于 Jenkins 的 CI/CD 环境,该环境应该构建(+ 测试)容器,然后将其推送到注册表。由于“从主机挂载”不再可能,我现在想知道将应用程序代码放入每个容器中的最佳方法是什么。
我们的设置中有两件事使这个恕我直言特别复杂:
- 我们有多个容器需要相同的应用程序代码
- “build-artifact”不是一个单一的、自容器的二进制文件(就像我们使用 go 那样),而是“我们所有的代码 + 安装的依赖项”==>“很多文件”(慢...)
- 涉及的构建步骤需要最终映像中不需要的软件
“3”的解决方案。通常是:使用多阶段构建。我们这样做。但是:那里的所有示例似乎都假设构建的代码将仅在另一个容器中使用(在我们的示例中并非如此,请参见 1。)
我们目前所做的
- 文件夹结构
- 引入一个额外的“构建器”容器来“构建”应用程序(获取“所有”应用程序代码作为构建上下文;运行“composer install”)
- 在每个需要应用程序代码的容器中从此构建器“复制”,例如通过
- 通过 docker-compose 编排
- 通过构建
临
- “较小”的图像(php-fpm 不会安装作曲家)
- 应用程序代码只构建一次,然后复制过来
魂斗罗
- 构建器容器除了“构建”之外没有其他用途 ==> 感觉不干净
- 构建“构建器”必须在构建任何其他容器之前完成
- 这意味着我们有一个额外的
备择方案
- 不要使用构建器容器,而是通过使用多阶段构建将构建步骤“合并”到例如“调度程序”容器中(因此我们最终不会在最终图像中使用作曲家)
- 摆脱“builder” - 但现在所有其他服务都依赖于“Scheduler” ==> 感觉更脏
- 使用卷共享代码
- 我们不必“复制”图像中的文件,而可以简单地“安装卷”==>感觉“干净”/没有“文件重复”(我首先认为这是一个非常好的方法......)
- 但:
- 您无法在构建期间填充卷,因此您需要“运行”容器以便在容器“中”获取应用程序代码 ==> 我们突然间不仅有一个构建器容器,而且我们还需要“运行”它填充音量
- 容器不再“自包含”,即从注册表中提取“仅调度程序”将不起作用 - 我们还必须有适当的卷并且必须由构建器填充 ==> 编排变得更加复杂
- 卷不是临时的,即在刷新之前它将包含“旧”应用程序代码 ==> 这可能会导致混乱和意外行为
链接
- 容器可以共享一个框架吗?(相关问题)
- https://github.com/moby/moby/issues/14080(不支持在构建期间挂载的卷)
- https://docs.docker.com/develop/develop-images/multistage-build/(构建器模式与多阶段构建)
docker - 在 docker 临时映像中运行静态构建时的安全性?
我目前正在评估不同的选项来减小图像大小。除了 alpine 之外,还可以选择使用多阶段 docker 构建在暂存镜像中运行静态构建,大多数人称之为安全(我同意攻击面)。但是由于不涉及用户管理等,这是否意味着以与执行它的 docker 守护进程相同的权限运行二进制文件?这里的安全点在哪里?
dockerfile - 在多阶段 docker build 中使用变量
我想在多阶段 docker 构建中使用变量。类似于这个问题(在撰写本文时尚未回答。)
我的具体用例是在一个builder
阶段构建我的 Go 项目并将完成的目录保存在一个变量中,并在下一个阶段使用相同的变量:BUILD_DIR
变量。
我的 Dockerfile 是(注释行中的示例不起作用。):
docker - docker 无法运行已经存在的 go 输出文件
我正在为我的 go 项目构建一个多阶段的 Dockerfile。
当我运行图像时,它会引发错误:
我已经验证了“主”文件存在于 /app/main 中。我还尝试通过添加来授予可执行权限
但它仍然不起作用。什么可能是错的?
node.js - 带有 Docker 和节点的 Docker 容器:不适用于多阶段
我想要一个 docker 容器,用于安装了 docker 和 node 的 CI 步骤。我认为这将是使用多阶段构建的完美用例。
我有一个新的 docker 版本Docker version 18.09.3, build 774a1f4
,我尝试了这个 Dockerfile,但无济于事:
生成的图像安装了诸如 npm 之类的节点东西,但没有 docker 的东西......有什么想法可以在这里继续吗?
非常感谢!
更新
我将 Dockerfile 更改为此,这也不起作用(容器中未安装 docker):
Update2 这个 Dockerfile 可以满足我的需要,但它不是多阶段的(我想在这里尝试)
docker - 无法从 docker 映像连接到 dockerhost
我正在尝试使用 docker(dind) 图像来构建图像。当我在 DockerFile 中运行docker info时,它抱怨找不到 dockerhost。在构建 Docker 映像时有什么办法,我们可以在构建步骤中使用 docker host 吗?
dockerfile - 使用具有多阶段构建的 Dockerfile 为每个构建参数命名一个阶段
是否有可能命名一个构建阶段?我正在搜索类似以下示例的内容:
如果我尝试此示例,则会发生此错误:
我还尝试将参数用作标记 ( modul:${NAME}
),结果相同。