dockerfile 和 docker-compose 中的条件图像使用

问题描述 投票:0回答:1

我看到了这个问题,但这对我的情况没有帮助。

我有几个

docker-compose.yml
文件和
Dockerfiles
,我用它们来构建几个具有依赖关系的图像。然而,他们大多有这样的段落:

(撰写时)

image: my_registry/image_name:${TAG:-latest}

或者:

(在 dockerfile 上)

FROM my_registry/image_name:latest

这对于测试目的来说很糟糕,因为 my_registry 只有生产映像(标签没有帮助)。因此,人们经常会在生产中测试东西。

就像如果可能有一个标志、设置或其他任何东西,当我在开发环境中时我可以设置:

(撰写时)

image: image_name:local

或者:

(在 dockerfile 上)

FROM image_name:local

并确保我使用带有本地代码的本地构建的图像,而不是带有生产分支中代码的生产图像。基本上,只要我不维护单独的文件,任何解决方法都是有效的。

docker docker-compose dockerfile docker-registry
1个回答
0
投票

对于 Compose 引用

image:
但您想使用本地构建版本的情况,在这种情况下使用 多个 Compose 文件 会有所帮助。这里的典型设置是
docker-compose.yml
文件具有“生产”设置

# docker-compose.yml
version: '3.8'
services:
  something:
    image: my_registry/image_name:${TAG:-latest}

但是然后在同一目录中放置一个

docker-compose.override.yml
。这已检查到源代码控制中,但不用作生产部署的一部分。这定义了您只能在本地使用的选项;这些选项与基本 Compose 文件中的内容合并。

# docker-compose.override.yml
version: '3.8'
services:
  something:
    build: .

这将在本地构建一个镜像;由于组合容器定义也有一个

image:
行,因此它将命名构建的图像
my_registry/image_name:latest
(或由
$TAG
指定的另一个值)。它不一定会将图像推送到远程存储库,除非您明确
docker-compose push
它。

相关的一点是,您可以命名图像,就好像它存在于远程存储库中一样,即使它实际上并不存在于远程存储库中。

docker build -t my_registry/image_name:nonexistent-tag .
docker tag anything my_registry/nonexistent-image

当 Dockerfile 具有

FROM
行时(或任何其他运行或使用映像时),如果本地使用具有正确名称的映像,则按原样使用;除非您明确要求,否则 Docker 不会联系注册表。

此工作流程的唯一真正问题是 Compose 无法声明仅构建映像但不运行任何内容的“服务”,或者让一个构建依赖于另一个构建。在构建其他本地映像之前,您可能必须手动构建基础映像(不一定要推送它)。

docker build -t my_registry/base_image ./base-image
docker-compose build
docker-compose up -d

这里的另一个关键假设是图像本身在所有环境中都是相同的。如果您需要主机名等详细信息,请使用环境变量等机制传递它们;不要将它们构建到图像中。

© www.soinside.com 2019 - 2024. All rights reserved.