Docker多阶段构建
发表于|更新于|容器
构建 Docker 镜像的时候,我们可以在机器上直接构建,也可以使用容器来构建,保证环境的统一性, 通过容器来构建会有一个问题,就是构建使用到的工具并不需要带入到真正的运行环境, 比如说使用 nodejs 的前端项目, 构建的时候需要 nodejs 或者 npm, 但是运行的时候需要的是 nginx. 多阶段构建即为构建完成后直接将代码塞进运行容器, 不会带入构建环境.
编写 Dockerfile
vim Dockerfile
1 | FROM node:14.20.1-buster AS build |
文章作者: 张理坤
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 杂烩饭!
相关推荐
2025-10-04
正在运行的Docker容器增加端口映射
为什么有这个需求假设有如下情况: 这个服务很重要,很多服务在连,停服不知道会有什么影响。 服务是运行在 docker 里的,但是 docker 启动命令找不到了。 想给 docker 容器临时增加一个端口映射。 方法一、使用工具反向代理这个方法性能不如上面的 iptables 规则,比如可以用 nginx 的 stream 四层代理,或者用 socat 一条命令搞定。 查看容器的 IP 地址 在结果中找到 NetworkSettings -> Networks -> <你的网络名称> -> IPAddress 方法二、参照 Docker 原生的方式docker 的 -p 命令来进行端口映射,本质上也是维护了一套 iptables 规则来实现的,docker-proxy 会维护 docker 需要的 iptables 规则,执行 iptables-save 可以查看所有的规则 (iptables-save 并不会真的 save,想保存 iptables 规则还需要额外的操作)。 获取容器的 IP 地址 在结果中找到 NetworkSet...
2025-07-23
快速搭建环境记录
快速搭建一套环境的记录,节省折腾的时间,可以配合 quickstart 食用 Python 环境可以直接使用 pipenv 这种工具. 也可以自己编译安装 安装编译需要的环境Ubuntu和Debian安装CentOS和Fedora安装 下载源码并编译安装到用户目录(推荐)安装到系统目录 添加到 PATH 环境变量 (可选) 添加到 PATH 环境变量 (可选) 增加 --enable-optimizations 参数速度编译速度会非常慢, 但是会优化 python 运行的性能。 配置国内源 java 环境官方网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html golang 环境 Dockerdocker.io如果你不介意版本问题,可以使用发行版源里的 docker.io ,安装很简单: Docker-CEDocker-CE 是官方社区版,一般更新比较及时 官方安装文档 nodejs我个人更建议把 nodejs 安装在 Ho...
2026-07-14
快速搭建ipsec Vpn
安装 Docker 启动服务 将 ikev2-vpn-data 文件复制到本地在 ikev2-vpn-data 目录中,证书或配置文件的位置: 操作系统 文件名 备注 Windows 和 Linux vpnclient.p12 Windows10 & 11 按照下文配置 VPN Android vpnclient.sswan 安卓需要安装 strongSwan 软件 Apple 设备 vpnclient.mobileconfig 导入描述文件即可 windows 客户端配置导入证书 证书会导入到 受信任的根证书颁发机构 IKEv2 VPN CA 另外,你也可以手动导入 .p12 文件。在导入证书后,你必须确保将客户端证书放在 “ 个人 -> 证书 “ 目录中,并且将 CA 证书放在 “ 受信任的根证书颁发机构 -> 证书 “ 目录中。 创建 VPN 连接在 Windows 计算机上添加一个新的 IKEv2 VPN 连接。对于 Windows 8.x 和 10,推荐从命令提示符运行以下命令创建 VPN 连接,以达到更佳的安全...
2025-10-29
使用kubeadm部署一套高可用k8s集群1.21 for CentOS
基于 centos 使用 kubeadm 搭建集群, ubuntu部署文档, 有疑问的地方可以看 官方文档 准备机器 我的机器详情如下, 配置至少为 4C4G hostname IP 作用 public 10.0.0.3 ingress 和 apiserver 的负载均衡,nfs 存储 master1 10.0.0.11 k8s master 节点 master2 10.0.0.12 k8s master 节点 master3 10.0.0.13 k8s master 节点 worker1 10.0.0.21 k8s worker 节点 worker2 10.0.0.22 k8s worker 节点 每台机器都做域名解析,或者绑定 hosts(可选但建议) 每台机器都关闭防火墙和 SELinux 负载均衡机器必须要关闭,因为 6443 不是 nginx 的标准端口,会被 selinux 拦截, 防火墙也需要放行 6443 端口, 可以考虑直接关闭 基础环境配置 基础环境是不管 master 还是 worker 都需要的环境 ...
2025-08-10
使用kubeadm部署一套高可用k8s集群1.21 for Ubuntu
基于 ubuntu 使用 kubeadm 搭建集群, centos部署文档, 有疑问的地方可以看 官方文档 准备机器 我的机器详情如下, 配置至少为 4C4G hostname IP 作用 public 10.0.0.3 ingress、apiserver 负载均衡,nfs 存储 master1 10.0.0.11 k8s master 节点 master2 10.0.0.12 k8s master 节点 master3 10.0.0.13 k8s master 节点 worker1 10.0.0.21 k8s worker 节点 worker2 10.0.0.22 k8s worker 节点 每台机器都做域名解析,或者绑定 hosts(可选但建议) 基础环境配置 基础环境是不管 master 还是 worker 都需要的环境 禁用 swap 确保每个节点上 MAC 地址和 product_uuid 的唯一性 sudo cat /sys/class/dmi/id/product_uuid 修改 hostname 允许 iptabl...

2025-03-24
java容器entrypoint.sh参数传递的隐藏陷阱
构建容器镜像对运维来说已经轻车熟路了,但是最近遇到个问题百思不得其解,准确的说就是手动执行 java -jar 带上所有参数,可以正常启动,但是打包成镜像就会报错: 先附上 entrypoint.sh Dockerfile: 看起来很正常对吧,但是启动报错: 查看控制台,echo 出来的 JAVA_CMD 变量也是正常的 中间排查过程忽略,最后增加了 set -x 参数后,重新打包镜像,再次查看控制台输出: 注意以 + 开头的输出 这里 java 启动命令是被解析成了单引号引用,所以造成无法启动。把 java 启动参数中的环境变量双引号去掉,可以正常启动了。 罪魁祸首:Shell 变量展开的分词机制问题的本质在于 Shell 脚本中变量展开时的参数分割规则。当我们使用 "$VAR" 这种带引号的写法时,变量值中的所有内容会被视为一个整体参数,即使其中包含空格也不会被分割。而 Java 虚拟机要求每个参数必须作为独立的命令行参数传递。
公告
此博客为我记录运维工作总结所用,供网友阅读参考,如有侵权,请通知我,我会核实后进行处理。
欢迎加博主微信,进微信运维技术交流群:


