Dockerfile 如何实现多阶段构建

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

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

编写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

示例

示例

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

关注公众号了解更多

关注公众号了解更多

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值