【问题标题】:Conditional COPY in Dockerfile?Dockerfile中的条件复制?
【发布时间】:2020-12-22 23:56:25
【问题描述】:

我有一个带有生产 Dockerfile 的应用程序,它将我们的源代码复制到容器中,即:

COPY . /app

我想将此复制设置为有条件的,以便传入CONTEXT= 环境变量防止/允许执行此行。这可能吗?

我在这里看到了related posts,但没有明确的答案。谢谢!

【问题讨论】:

  • ...非生产 Dockerfile 如何将代码放入映像中?为什么生产和非生产图像不同?
  • 开发容器通过 Docker-Compose 启动,它在 /app 上挂载一个卷,然后(希望)加载这个 Dockerfile
  • @DavidMaze 有一点,因为生产和开发容器应该构建相同。您可以在/app 使用卷而不会出现任何问题,因为它会覆盖图像的内容。
  • 谢谢 Gusavo,我不知道卷会覆盖复制的文件夹!虽然这不是一个完美的解决方案,因为 COPY 命令需要时间来运行,在我的情况下是 20 秒......

标签: docker environment-variables cloud devops


【解决方案1】:

this post 我发现 Docker-Compose 3.7 支持针对单个构建阶段。

所以我创建了一个包含 2 个阶段的 Dockerfile,一个用于设置容器的 base 层,然后是一个在代码库中复制的 deploy

# BUILD STAGE 1 - BASE
FROM webdevops/php-apache:7.2-alpine as base

# Do stuff

# BUILD STAGE 2 - DEPLOY
FROM base as deploy

# Add project
COPY . /app

# Do other stuff

然后我将我的开发人员docker-compose.yml 配置为仅针对基础层,并为代码安装一个卷。

version: "3.7"

services:
  app.base.img:
    build:
      context: .
      target: base
    volumes:
      - ./:/app
    container_name: app.base

我的生产流水线正常构建图像(包含两个层)。

注意版本 3.7 声明,显然它是必需的。

这就是我想要的,感谢所有关于此的 cmets 和建议!如果您认为这是不明智的,请随时发表评论。

【讨论】:

  • 天才!我一直在寻找合适的解决方案,这是迄今为止我见过的最好的解决方案!
【解决方案2】:

没有。您应该在构建最终图像之前对项目进行预处理。

多阶段构建可能会帮助您做到这一点:

FROM debian AS builder
ARG CONTEXT
WORKDIR /final
COPY . /app
RUN bash -c "[ '$CONTEXT' = '1' ] || cp -rfv /app/* /final/"

FROM debian
COPY --from=builder /final /app

在此示例中,传递 --build-arg CONTEXT=1 可防止它填充最终图像中的 /app 文件夹,从而将其从最终图像中删除。

【讨论】:

  • 感谢这个例子,这是一个创造性的解决方案。我不知道COPY --from 功能!我将暂时保留这个问题,看看是否有其他人有想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多