Dockerfile文件常用命令详解

简介: 说到 Docker 容器,就不得不提一个非常重要的文件 Dockerfile,它是用于定义镜像构建过程的配置文件。在 Dockerfile 文件中,包含了镜像构建过程中需要执行的命令已经相关的操作。Dockerfile 文件在不同的环境下执行就会生成对应环境的镜像服务,从而能够快速的实现容器迁移和集群部署。也正因为如此,Docker 容器能够跨平台部署和运行。

前言

说到 Docker 容器,就不得不提一个非常重要的文件 Dockerfile,它是用于定义镜像构建过程的配置文件。在 Dockerfile 文件中,包含了镜像构建过程中需要执行的命令已经相关的操作。Dockerfile 文件在不同的环境下执行就会生成对应环境的镜像服务,从而能够快速的实现容器迁移和集群部署。也正因为如此,Docker 容器能够跨平台部署和运行。

正文

如果我们想要构建自己的服务镜像,可以通过两种方式,第一种是通过直接保存当前运行的容器,然后将生成的镜像文件重新命名,也就是通常使用的 docker tag 命令,最后再把重命名的镜像推到公有云仓库或者私有仓库。第二种就是利用本文介绍的 Dockerfile 文件,进行重新构建,再推到相应的仓库。

总体上来说,Dockerfile 理解为一个由上往下执行指令的脚本文件。构建镜像时,Docker 会逐行解析 Dockerfile 中的命令,通过观察构建日志,我们也可以知道 Dockerfile 文件所有命令的执行顺序是顺序执行的。

构建实例日志:

current os:Linux
docker build -f Dockerfile.x86 -t registry.cn-beijing.aliyuncs.com/liuzhen007/bag-x86:1.6.6 .
Sending build context to Docker daemon  337.4MB
Step 1/15 : FROM registry.cn-beijing.aliyuncs.com/liuzhen007/base-x86-ffmpeg:1.0
 ---> c91b1af20a82
Step 2/15 : USER root
 ---> 827d7a1d2e52
Step 3/15 : ENV TZ=Asia/Shanghai
 ---> b1d66c3f4cc8
Step 4/15 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 ---> c21e6a502a33
Step 5/15 : WORKDIR /root/bag/
 ---> c224c6317820
Step 6/15 : COPY ./bin/bag .
 ---> 59b4d013ce87
Step 7/15 : COPY ./bin/server.crt .
 ---> 36b92b7306f8
Step 8/15 : COPY ./bin/server.key .
 ---> 25da16fc2011
Step 9/15 : COPY ./config.example.yaml ./config.yaml
 ---> 44d1ae9f2686
Step 10/15 : RUN echo "/usr/local/lib/" >> /etc/ld.so.conf  && ldconfig
 ---> Running in bb907e7a1eb7
Step 11/15 : RUN mkdir /var/www && mkdir /var/www/html && mkdir /var/www/html/user-media &&  mkdir /var/www/html/module
 ---> Running in 7e1da4234327
Removing intermediate container 7e1da4234327
 ---> 4b4ca4e832f2
Step 12/15 : COPY ./data /var/www/html/user-media
 ---> 62a16954bafd
Step 13/15 : COPY ./docker/module /var/www/html/module
 ---> bb4e96ffdc57
Step 14/15 : COPY ./docker/moviemasher ./
 ---> 955a6248856e
Step 15/15 : CMD ["./bag"]
 ---> 7af71e575223
Successfully built 7af71e575223
复制代码

命令分析

FROM

完全从0构建一个新镜像是不现实的,一般的做法都是先依赖一个基础镜像,再在这个基础镜像的基础上添加自己的需要的环境和代码程序。当声明基础镜像时,就需要用到 FROM 这个命令。

一般命令格式如下:

FROM image AS name

实例参考:

From golang:1.14.2-alpine3.11 AS test

RUN

在镜像构建过程中,我们可以执行相应的命令,一般命令格式如下:

RUN command

实例参考:

RUN go mod tidy

RUN go build main.go

COPY和ADD

在构建新的镜像的时候,我们可能需要将一些配置文件、程序代码或者执行脚本导入到镜像内的文件系统里,COPY 和 ADD 命令就是用来干这个的。

一般命令格式如下:

COPY [--chown=:] ["<源路径1>",...  "<目标路径>"]

ADD [--chown=:] ["<源路径1>",...  "<目标路径>"]

实例参考:

COPY ./.netrc /app

COPY . /app/bag

CMD

基于镜像启动的容器,在容器启动时会根据镜像构建时指定的命令来启动一个进程。而这个命令的定义,就是通过 Dockerfile 中的 CMD 命令来实现的。

一般命令格式如下:

CMD ["<可执行文件或命令>","param1","param2",...]

实例参考:

CMD ["node", "bin/www"]

结尾

熟悉 Dockerfile 的命令是编写 Dockerfile 的前提,本文只介绍了几个最为常见的命令,感兴趣的小伙伴可以自己去深入了解一下。好了,今晚的内容就介绍这么多,晚安。我是 liuzhen007,欢迎关注,分享更多容器相关知识。



作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
162436 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
安全 Go 调度
Go协程探秘:轻量、并发与性能的完美结合
Go协程探秘:轻量、并发与性能的完美结合
469 0
|
机器学习/深度学习 Ubuntu 决策智能
ubuntu16.04中将自己的ubuntu做成镜像
ubuntu16.04中将自己的ubuntu做成镜像
717 0
|
安全 测试技术 网络安全
|
6天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
17天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1317 7
|
4天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
286 128
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。