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-05-28
PHP应用容器化遇到的一些问题
这里以 WordPress 为例,我们不用官方的镜像,而是用 php 镜像 php 官方有个自带 apache 的版本,如:php:8.1.32-apache, 建议用这个版本,这个版本不用考虑 Nginx 和 php 的文件共享问题,启动容器: 自定义 php 配置文件比如调整 PHP 上传文件大小限制 docker run 的时候挂载 php.ini php.ini 增加 安装 Core 扩展这个时候说明 php 正常工作了,但是缺扩展。 安装其他扩展 比如安装 imagick,整合到 dockerfile 里构建个新的镜像。imagick 使用 pecl 安装 安装自定义 PHP 扩展比如安装主题的时候需要安装主题文件提供的扩展: 查看 php 扩展目录 把这个目录挂载出来,将扩展文件放进去。或者挂载一个新的目录 然后 php.ini 中指定扩展路径 WordPress 常见警告post_max_size 的值小于 upload_max_filesize 这个问题需要配置一下 php.ini 反向代理问题WordPress 经过 Ngin...
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 都需要的环境 ...
2026-09-12
快速搭建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 连接,以达到更佳的安全...
2026-09-12
Dockerfile中ADD文件的路径问题
首先看一个案例 当前目录的文件如下: Dockerfile 文件内容如下: 本意是想把当前目录下的所有文件放到容器内的 /code 目录, 这个时候使用 docker build 后无法启动, 进入容器, 打开 /code 一看: 会发现, 本来 3 这个文件应该是在 2 这个文件夹内的, 现在统一都跑到了上级目录了, 文件路径完全变了. 自然无法启动. 可以做如下修改:

2025-03-13
使用 Docker 搭建集群版 Elasticsearch 学习环境
一般来说,学习 ES 都是自己先搭建几台虚拟机,然后在虚拟机里部署 ES 集群,这样做资源消耗比较大,一般的电脑都没有这么高的配置,我们可以使用 Docker 来快速部署一套 Elasticsearch 集群,这里以 3 节点集群为例: 准备 Docker 网络集群节点之间是通过 ip 进行交互的,所以需要固定一下 ip,固定 ip 之前需要先创建一个 Docker 私有网络,并固定网段 (网段不要和你的内网冲突) 集群版 Elasticsearch 需要生成证书默认生成 3 年证书,我指定生成了 100 年的证书, 生成到了 certs 目录下。 指定 IP 运行容器我这里将数据持久化到了 docker 卷中,通过 docker volume ls 可以查看。 elasticsearch1 elasticsearch2 elasticsearch3 初始化密码需要等待服务启动后才可设置初始化密码,命令只能生成一次。 部署 kibana准备 kibana.yml密码按照实际情况修改 准备 kibana.sh

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

