你什么时候想“组合”Docker 镜像?
正如其他人在这里指出的那样,您通常不希望将数据库和应用程序放入同一个 Docker 映像中。理想情况下,您希望 Docker 映像包装“单个进程”/“运行时”。这允许每个过程按比例放大/缩小并单独重新启动。
假设您想使用一些在您正在使用的映像的包管理器中不可用的共享 C 库/可执行文件,但其他人已经创建了一个预编译的映像- 您可能不想将这些二进制文件重新编译为构建的一部分(取决于这需要多长时间)。有没有一种方法可以基于现有图像快速创建包含所有这些可执行文件/库的 POC-Docker 图像?
Docker 和组合
相关讨论:https ://github.com/moby/moby/issues/3378
Docker 缺乏的是一种组合图像的好方法。您可以使用COPY --from=<image> <from-path> <to-path>
. 没有将环境变量从另一个图像复制到您自己的图像的内置方法。
也就是说,我亲自为 Dockerfiles 创建了一个自定义前端/解析器,它添加了一个INCLUDE <image>
-keyword。这会将整个文件系统以及环境变量复制到您的映像中:
DOCKER_BUILDKIT=1 docker build -t myimage .
#syntax=bergkvist/includeimage
FROM alpine:3.12.0
INCLUDE rust:1.44-alpine3.12
INCLUDE python:3.8.3-alpine3.12
nixpkgs.docker工具
如果您想要真正可组合的 Docker 构建,我建议您查看nixpkgs中的dockerTools。这也将导致更可重现(通常非常小)的图像。请参阅https://nix.dev/tutorials/building-and-running-docker-images
docker load < $(nix-build docker-image.nix)
# docker-image.nix
let
pkgs = import <nixpkgs> {};
python = pkgs.python38;
rustc = pkgs.rustc;
in pkgs.dockerTools.buildImage {
name = "myimage";
tag = "latest";
contents = [ python rustc ];
}