首页 > 其他分享 >Dockerfile 如何实现多阶段构建

Dockerfile 如何实现多阶段构建

时间:2023-08-07 15:05:54浏览次数:33  
标签:容器 nginx 构建 阶段 镜像 docker COPY Dockerfile 目录

Dockerfile 如何实现多阶段构建_docker

我们在构建一些自定义镜像的时候,可能会需要引用别的镜像去做一些事情,但是跟最终结果又没太大的关系,这个时候大概率就要使用多阶段构建了!

案例的情况一般不会那样使用,这里只是作为演示!

编写Dockerfile

我们新建一个名叫Dockerfile的文件,在编辑器里对他进行编辑!

常用命令和关键字

FROM

指定基础镜像,用作新镜像的起点。

LABEL

指定镜像的维护者信息。

RUN

在镜像中执行命令,可以用于安装软件包、运行脚本等。

COPY 或 ADD

将文件从主机复制到镜像中。

ADD 可以自动解压文件 如gzip的文件,COPY不可以

都是针对于Dockerfile所在宿主目录的上下文,即不可以COPY 或 ADD宿主其他目录的内容!

WORKDIR

设置工作目录,即后续命令的执行路径。(容器内)

ENV

设置环境变量。(容器内)

EXPOSE

声明容器运行时监听的端口。

VOLUME

指定容器中的挂载点,用于持久化数据。

注意这里的挂载目录是创建在容器内部的,若容器内部没有会自动创建!

要使用docker run -v 进行具体指定宿主的目录,若未指定,则会在宿主数据目录生成唯一的目录绑定,但是每次创建容器会重新生成,无法达到数据持久化的目的!

宿主的数据目录一般是/var/lib/docker,所以会创建在/var/lib/docker/volumes下,但不是每个服务器都在这个目录,可使用以下命令查看:

# 查看Docker数据目录的确切位置
 sudo docker info | grep "Docker Root Dir"
 
 # 输出
 Docker Root Dir: /var/lib/docker

Dockerfile 如何实现多阶段构建_docker_02

示例

CMD

指定容器启动时要执行的命令,只能有一个 CMD 指令。(一般放最后)

编写文件

这里的示例是先使用node把前端项目打包成静态资源,然后使用nginx代理静态资源!

# 第一阶段:构建前端应用
# 使用node打包dist包
FROM node:16.17.0 as node_bulid

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm install

COPY . .

# 打包静态资源 /app/dist
RUN npm run build

# 第二阶段:构建最终镜像 nginx
FROM nginx:latest

# 把第一阶段的 前端应用 合并把当前
COPY --from=node_bulid /app/dist /usr/share/nginx/html

EXPOSE 80

# 为主进程启动Nginx服务器,并保持其在前台运行
# dockerfile 一定要写daemon off 否则,docker run 会起不起来
CMD ["nginx", "-g", "daemon off;"]

打包自定义镜像

# -t为指定构建镜像的名字和版本,格式为'name:tag' 如 nginx:1.1.0
# imageName 是打包完镜像的名字, run 的时候会用到
# . 指当前目录的所有文件
docker build -t imageName .

运行镜像

# -d 后台进程运行
# -p 80:80 宿主端口:容器暴露端口
# --name imageName1 是docker运行之后容器的名称
# 最后的imageName 是所使用的镜像
docker run -p 80:80 --name imageName1  -d  imageName

Dockerfile 如何实现多阶段构建_docker_03

关注公众号了解更多

标签:容器,nginx,构建,阶段,镜像,docker,COPY,Dockerfile,目录
From: https://blog.51cto.com/u_16123566/6993801

相关文章

  • 构建跨平台的.NET Core控制台应用程序
    在本博客中,我们将介绍如何构建一个跨平台的.NETCore控制台应用程序。.NETCore是一个开源的跨平台框架,它可以在Windows、macOS和Linux等操作系统上运行。通过.NETCore,我们可以轻松地构建具有高度可移植性的应用程序。以下是步骤:步骤1:安装.NETCoreSDK首先,你需要安装.NETCoreSD......
  • 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面
    前言最近也是有机会参与到了腾讯云举办的腾讯云CloudStudio实战训练营,借此了解了腾讯云CloudStudio产品。腾讯云CloudStudio的出现是有一定创新性的,使用它进行开发免去了使用一些传统开发工具的成本。如下载一个开发工具就要进行基本的开发环境配置,以及下载、安装......
  • DockerFile 构建缓存 Buildkit
    缓存Dockerfile构建缓存功能从Docker17.05版本开始引入可以加速构建直接服用缓存构建我们看到fromcache就是来自缓存缓存是一个命令为单位如果想服用缓存需要考虑查看缓存大小清除缓存dockervolumeprune--all--forcedockerimageprune--all--force......
  • 如何构建一个 NodeJS 影院微服务并使用 Docker 部署
    前言如何构建一个NodeJS影院微服务并使用Docker部署。在这个系列中,将构建一个NodeJS微服务,并使用DockerSwarm集群进行部署。以下是将要使用的工具:NodeJS版本7.2.0MongoDB3.4.1DockerforMac1.12.6在尝试本指南之前,应该具备:NodeJS的基本知识Docker的基本知识(并且已经......
  • 【腾讯云Cloud Studio实战训练营】React 快速构建点餐页面
    前言:CloudStudio是一个在线的云集成开发环境(IDE),可以让开发人员在浏览器中轻松地开发、测试、调试和部署应用程序。它提供了基于云的计算资源和工具,例如代码编辑器、编译器、调试器、版本控制系统和项目管理工具等,使开发人员可以在任何地点使用任何设备进行开发,而不需要在本地安装......
  • Flowise AI:用于构建LLM流的拖放UI
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景什么是FlowiseAI?FlowiseAI是一个开源的UI可视化工具,用于帮助开发LangChain应用程序。在我们详细介绍FlowiseAI之前,让我们快速定义LangChain。LangChain是一个框架/python库,可帮助您利用LLM构建自己的自定义NLP......
  • jinjat 基于dbt 构建低代码数据应用
    jinjat的设计还是比较有意思的,直接利用了dbt,同时利用了一个analyses配置,analyses在dbt中更多属于一个基于现有的模型进行编译,但是不进行执行,jinjat就利用了功能,但是扩展了下参考使用模型analysis/my_first_api.sql {%-setquery=request().query%}......
  • 使用 ChatGPT 构建数学测验应用程序:迭代提示之旅
    必应生成的AI图像周末,我和我12岁的孩子谈论ChatGPT以及如何制作提示来让它做不同的事情。与其试图解释这些大型语言模型聊天机器人可以做什么,我想为什么不玩得开心,并尝试通过玩不同的提示并看看会发生什么来实际构建一个小的数学测验应用程序。数学测验应用要求为12岁......
  • 赋能智慧医疗:构建高效电子处方小程序的技术要点
    时下,医疗行业也开始积极融合信息技术,将智慧医疗带入现实。其中,电子处方作为智慧医疗的重要组成部分,为传统的纸质处方带来了革命性的改变。电子处方小程序的出现使医生和患者能够更加高效地管理和获取处方信息,本文将就如何构建高效电子处方小程序进行探讨。一、数据安全的重要性在构......
  • Pinia - 构建用户仓库 和 持久化
    官方文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/安装插件pinia-plugin-persistedstatepnpmaddpinia-plugin-persistedstate-D使用main.js配置importpersistfrom'pinia-plugin-persistedstate'...app.use(createPinia().use(persist......