问题标签 [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.

0 投票
1 回答
2324 浏览

docker - Docker多阶段构建不在阶段之间复制

我正在尝试创建一个多阶段构建,其中第一阶段为主题安装纱线,第二阶段为 Drupal 设置 PHP 环境。

当我查看输出时,看起来 yarn install 正在运行,但COPY底部附近的命令并未将其复制到 PHP 映像中。如果我是对的,那么应该在我的本地机器上创建 node_modules 目录吗?

码头工人-compose.yml:

Dockerfile:

0 投票
1 回答
1802 浏览

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 中指定我需要首先构建共享映像,然后构建其他映像(然后运行它们的容器)?

0 投票
1 回答
1749 浏览

docker - 在同一容器中为 python 和 nodejs 多阶段构建

npm我需要在同pipenv一个容器中访问两者。我认为实现这一目标的最佳方法是使用多阶段构建。

如果我做这样的事情:

如何确保pipenv二进制文件不被丢弃?我需要从上一阶段复制哪些文件才能使 pipenv 在最终图像中可用?

0 投票
1 回答
1022 浏览

php - Docker:如何在多个容器/服务之间共享相同的应用程序代码(例如 PHP-FPM 和 NGINX)

tl;博士

  • 应用程序代码需要一个构建步骤(引入依赖项)
  • 多个容器需要相同的“构建”代码

问:使用 docker / docker-compose 存档的好的策略/工作流程是什么?

我们正在使用多个组件(容器/服务)对 PHP 应用程序进行 dockerizing,例如

  • 工作节点(PHP 进程通过主管保持活动状态)
  • 调度程序(管理工作人员并在 cron 中运行重复任务)
  • PHP-FPM/Nginx(网页界面)

这些服务在 docker-compose 文件中定义。在开发过程中,我们通过卷从每个容器的主机上的目录中挂载应用程序代码,以便我们“立即”看到每个服务中的更改(示例)。生活很好。

我们现在正在建立一个基于 Jenkins 的 CI/CD 环境,该环境应该构建(+ 测试)容器,然后将其推送到注册表。由于“从主机挂载”不再可能,我现在想知道将应用程序代码放入每个容器中的最佳方法是什么。

我们的设置中有两件事使这个恕我直言特别复杂:

  1. 我们有多个容器需要相同的应用程序代码
  2. “build-artifact”不是一个单一的、自容器的二进制文件(就像我们使用 go 那样),而是“我们所有的代码 + 安装的依赖项”==>“很多文件”(慢...)
  3. 涉及的构建步骤需要最终映像中不需要的软件

“3”的解决方案。通常是:使用多阶段构建。我们这样做。但是:那里的所有示例似乎都假设构建的代码将仅在另一个容器中使用(在我们的示例中并非如此,请参见 1。)

我们目前所做的

  • 文件夹结构
  • 引入一个额外的“构建器”容器来“构建”应用程序(获取“所有”应用程序代码作为构建上下文;运行“composer install”)
  • 在每个需要应用程序代码的容器中从此构建器“复制”,例如通过
  • 通过 docker-compose 编排
  • 通过构建

  • “较小”的图像(php-fpm 不会安装作曲家)
  • 应用程序代码只构建一次,然后复制过来

魂斗罗

  • 构建器容器除了“构建”之外没有其他用途 ==> 感觉不干净
  • 构建“构建器”必须在构建任何其他容器之前完成
    • 这意味着我们有一个额外的

备择方案

  • 不要使用构建器容器,而是通过使用多阶段构建将构建步骤“合并”到例如“调度程序”容器中(因此我们最终不会在最终图像中使用作曲家)
    • 摆脱“builder” - 但现在所有其他服务都依赖于“Scheduler” ==> 感觉更脏
  • 使用卷共享代码
    • 我们不必“复制”图像中的文件,而可以简单地“安装卷”==>感觉“干净”/没有“文件重复”(我首先认为这是一个非常好的方法......)
    • 但:
    • 您无法在构建期间填充卷,因此您需要“运行”容器以便在容器“中”获取应用程序代码 ==> 我们突然间不仅有一个构建器容器,而且我们还需要“运行”它填充音量
    • 容器不再“自包含”,即从注册表中提取“仅调度程序”将不起作用 - 我们还必须有适当的卷并且必须由构建器填充 ==> 编排变得更加复杂
    • 卷不是临时的,即在刷新之前它将包含“旧”应用程序代码 ==> 这可能会导致混乱和意外行为

链接

0 投票
1 回答
395 浏览

docker - 在 docker 临时映像中运行静态构建时的安全性?

我目前正在评估不同的选项来减小图像大小。除了 alpine 之外,还可以选择使用多阶段 docker 构建在暂存镜像中运行静态构建,大多数人称之为安全(我同意攻击面)。但是由于不涉及用户管理等,这是否意味着以与执行它的 docker 守护进程相同的权限运行二进制文件?这里的安全点在哪里?

0 投票
1 回答
2178 浏览

dockerfile - 在多阶段 docker build 中使用变量

我想在多阶段 docker 构建中使用变量。类似于这个问题(在撰写本文时尚未回答。)

我的具体用例是在一个builder阶段构建我的 Go 项目并将完成的目录保存在一个变量中,并在下一个阶段使用相同的变量:BUILD_DIR变量。

我的 Dockerfile 是(注释行中的示例不起作用。):

0 投票
1 回答
537 浏览

docker - docker 无法运行已经存在的 go 输出文件

我正在为我的 go 项目构建一个多阶段的 Dockerfile。

当我运行图像时,它会引发错误:

我已经验证了“主”文件存在于 /app/main 中。我还尝试通过添加来授予可执行权限

但它仍然不起作用。什么可能是错的?

0 投票
0 回答
137 浏览

node.js - 带有 Docker 和节点的 Docker 容器:不适用于多阶段

我想要一个 docker 容器,用于安装了 docker 和 node 的 CI 步骤。我认为这将是使用多阶段构建的完美用例。

我有一个新的 docker 版本Docker version 18.09.3, build 774a1f4,我尝试了这个 Dockerfile,但无济于事:

生成的图像安装了诸如 npm 之类的节点东西,但没有 docker 的东西......有什么想法可以在这里继续吗?

非常感谢!

更新

我将 Dockerfile 更改为此,这也不起作用(容器中未安装 docker):

Update2 这个 Dockerfile 可以满足我的需要,但它不是多阶段的(我想在这里尝试)

0 投票
1 回答
68 浏览

docker - 无法从 docker 映像连接到 dockerhost

我正在尝试使用 docker(dind) 图像来构建图像。当我在 DockerFile 中运行docker info时,它抱怨找不到 dockerhost。在构建 Docker 映像时有什么办法,我们可以在构建步骤中使用 docker host 吗?

0 投票
1 回答
500 浏览

dockerfile - 使用具有多阶段构建的 Dockerfile 为每个构建参数命名一个阶段

是否有可能命名一个构建阶段?我正在搜索类似以下示例的内容:

如果我尝试此示例,则会发生此错误:

我还尝试将参数用作标记 ( modul:${NAME}),结果相同。