docker - 如何构建支持多种语言(c、c++、rust、java、go、python、javascript、nodejs 等)的轻量级 docker 镜像
问题描述
我是 docker 的新手——我正在寻找一个支持多种语言的 docker 镜像。
我打算做的是以 alpine 为基础并安装所有用于 c++、c、rust 等的运行时库......我不确定什么是正确的做法。我已经搜索了 docker hub 但没有找到。
解决方案
正如@David 所提到的,在 Docker 中不建议这样做,即使您使用 alpine,它也永远不会创建轻量级映像。
如果您访问 PHP、nodejs 和 golang 的官方 docker hub,您会感到惊讶。
PHP 大约350MB (Alpine)
Golang 大约360MB (Alpine)
Nodejs 大约80MB (Alpine)
保留您在问题中提到的其余部分,例如,由于 OS alpine 大小,每个减去5MB仍然高于800MB,最终通过添加其余部分变得越来越大。
或者,您可以多阶段映像,但同样您必须在 Dockerfile 中管理和放置条件语句,以处理 nodejs 中的命令npm install
,并composer install
在 PHP 和 bla bla 中执行。
您可能会构建这样的图像,但它必须再次像一团糟一样管理。
ARG BASE_IMAGE="go"
FROM golang:alpine as go
FROM node:alpine as node
FROM php:7.0-apache as php
FROM nginx:alpine as nginx
FROM ${BASE_IMAGE}
ENV BASE_IMAGE=$BASE_IMAGE
将每个容器限制为一个进程是一个很好的经验法则
如果容器的经验法则是每个容器有一个进程,那么我认为它应该只为该进程提供一个环境。
推荐阅读
- redis - redis中key的重置值
- python - 从 numpy 数组中传递要从开始顺序扣除的数字
- java - 用 Arraylist 替换 Vector(insertElementAt 问题)
- java - 带有弹性搜索的 Spring Boot 导致 java.lang.NoSuchFieldError: IGNORE_DEPRECATIONS
- c# - UnitOfWork 完成后我应该怎么做才能添加域事件?
- wordpress - 修改 Wordpress 插件不反映更改
- python - 如何在代码中使用 Adam 优化器而不是 L-BFGS-B 进行约束优化
- php - 为什么表格不适用于第二个 TABLE?
- typescript - 在映射类型中使用 keyof 在 typescript 中返回值数组
- r - 有没有办法根据另一列的值替换缺失值以匹配列名