首页 > 其他分享 >深入理解Dockerfile:构建容器化应用的基石

深入理解Dockerfile:构建容器化应用的基石

时间:2023-12-08 14:01:23浏览次数:36  
标签:容器 ENTRYPOINT 指令 构建 path 镜像 Dockerfile 基石

Docker已经成为现代软件开发和部署的标配工具之一,它的轻量级容器技术使得应用可以在不同环境中快速部署和运行。Dockerfile是构建Docker镜像的蓝图,定义了从基础镜像到最终应用镜像的一系列步骤。本篇博文将深入解析Dockerfile中常见的指令,带你逐步了解如何构建高效、可维护的Docker镜像。

1. FROM:选择基础镜像

FROM base_image[:tag]

FROM指令定义了构建镜像的起点,选择一个已有的基础镜像。这可以是官方仓库的镜像(如ubuntualpine),也可以是自定义的基础镜像。

FROM ubuntu:20.04

2. MAINTAINER:添加作者信息

MAINTAINER author_name

MAINTAINER指令用于设置镜像的作者信息,提供了构建者的联系方式。

MAINTAINER John Doe <[email protected]>

3. RUN:执行命令

RUN command

RUN指令允许在镜像中执行命令,通常用于安装软件包、配置环境等。可以使用&&连接多个命令,以减少镜像层的数量。

RUN apt-get update && apt-get install -y python

4. WORKDIR:设置工作目录

WORKDIR /path/to/directory

WORKDIR指令用于设置后续命令的工作目录,有助于组织文件结构。

WORKDIR /app

5. COPY和ADD:复制文件

COPY src_path dest_path
ADD src_path dest_path

COPYADD用于将本地文件复制到镜像中,区别在于ADD支持URL和自动解压缩。

COPY . /app
ADD https://example.com/file.tar.gz /app

6. EXPOSE:声明端口

EXPOSE port

EXPOSE指令声明容器运行时会监听的端口,但并不会实际打开或映射这些端口。

EXPOSE 80

7. CMD和ENTRYPOINT:设置启动命令

CMD command
ENTRYPOINT command

CMDENTRYPOINT用于设置容器启动时执行的默认命令,可以带参数。区别在于CMD的参数可以被覆盖,而ENTRYPOINT的参数不会被覆盖。

CMD ["python", "app.py"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]

8. ENV:设置环境变量

ENV key value

ENV指令用于设置环境变量,可在后续命令中使用。

ENV APP_HOME=/app

9. ARG:构建参数

ARG variable=value

ARG指令定义构建时传递给镜像的参数,类似于变量。

ARG user=appuser

10. VOLUME:声明数据卷

VOLUME /path/to/directory

VOLUME指令声明容器中的数据卷,用于持久化数据。

VOLUME /var/log

结语

通过这份Dockerfile指令详解,你应该对如何编写高效、可维护的Dockerfile有了更深入的了解。合理使用这些指令,可以构建出安全、可重复部署的容器化应用。在实际应用中,结合具体场景,选择适当的基础镜像和指令组合,将帮助你更好地利用Docker构建和管理应用。在以后的博文中,我们还将深入探讨一些高级的Dockerfile技巧和最佳实践。敬请关注!

标签:容器,ENTRYPOINT,指令,构建,path,镜像,Dockerfile,基石
From: https://blog.51cto.com/jiemei/8737199

相关文章

  • 容器启动流程(containerd 和 runc)
    启动流程containerd作为一个api服务,提供了一系列的接口供外部调用,比如创建容器、删除容器、创建镜像、删除镜像等等。使用docker和ctr等工具,都是通过调用containerd的api来实现的。kubelet通过cri调用containerd和这些不一样,后续我会介绍到。containerd创建容......
  • 02Docker容器卷
    Docker容器卷1.数据卷是什么简而言之:就是Docker用来存储数据的,在镜像被删除的时候,卷中数据不会被删除,就是相当于一个数据库备份数据,相当于Windows中的目录或文件2.目的解决数据持久化独立容器的生存周期,帮助容器间继承和共享数据3.数据卷的使用1.直接添加docke......
  • list容器
    3.7.4list大小操作功能描述:对list容器的大小进行操作 函数原型:size();//返回容器中元素的个数empty();//判断容器是否为空resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。re......
  • docker-compose运行的容器 curl No route to host
    #信任docker0网卡firewall-cmd--permanent--zone=trusted--change-interface=docker0&&firewall-cmd--reloaddockernetworkinspectcsrpmed_default#找出默认网段w为172.20.0.0/16[{"Name":"csrpmed_default","Id&quo......
  • 定时清理docker容器日志
    场景:docker容器启用一段时间之后日志会逐渐累积,越来越臃肿,可能高达几十个G,我们需要定期自动清理此容器日志1.创建文件夹,创建文件写入命令,更改可执行权限:mkdir-p/opt/docker-shcat>/opt/docker-sh/clean_docker_log.sh<<EOF#!/bin/shecho"========startclean......
  • 一、Spring学习 : 容器---->BeanFactory+ApplicationContext 的多种容器实现
    BeanFactory实现的特点我们来着重讲一下DefaultListableBeanFactory这个实现类:点击查看完整代码packagecom.itvayne.springbootcloudstudy.beanfactory01;importcom.sun.org.slf4j.internal.Logger;importcom.sun.org.slf4j.internal.LoggerFactory;importorg.springf......
  • 2023.12.5 stl list容器
    3.7.1list基本概念 功能:将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域 STL中的链表......
  • 如何在不破坏docker容器的情况下更新nvidia驱动
    参考资料:[驱动-CUDA对照表][驱动下载页][重装驱动的一个教程][整体的一个方法指导]由于项目结题,需要在一个较旧的8卡V100服务器上运行机器学习代码,但是这个服务器上面的docker驱动却旧到爆炸,请看VCR:2023年了居然显卡驱动还停留在418,这......
  • stl容器
    3.5stack容器3.5.1stack基本概念 概念:stack是一种先进后出(FirstInLastOut,FILO)的数据结构,它只有一个出口   栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为栈中进入数据称为---入栈push栈中弹出数据称为---出栈pop 生活中的栈:   ......
  • 为什么stack和queue默认使用deque作为底层容器?
    在C++中,stack和queue默认使用deque作为底层容器的原因主要有以下几点:操作效率:deque(双端队列)支持在头尾两端进行插入和删除操作,且时间复杂度都为O(1),非常高效1。而vector在增长到一定长度时为了保证完全连续,需要重新申请更长的内存,并把原来的元素全部拷贝过去2。这使得vector......