Dockerfile 如何实现多阶段构建

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

Dockerfile 如何实现多阶段构建
示例

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 如何实现多阶段构建

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151402.html

(1)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!