❝
我们在构建一些自定义镜像的时候,可能会需要引用别的镜像去做一些事情,但是跟最终结果又没太大的关系,这个时候大概率就要使用多阶段构建了!
案例的情况一般不会那样使用,这里只是作为演示!
❞
编写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
原文始发于微信公众号(分享是个有趣的东西):Dockerfile 如何实现多阶段构建
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151402.html