Dockerfile自定义制作镜像,其中10个指令的作用分析

news/2024/9/24 9:07:11/

docker容器

镜像重要技能。

docker commit只能制作比较简单的镜像,

要制作比较完善的镜像,

自定义程度比较高的,

就需要用到dockerfile

dockerfile可以回溯历史

动态生成镜像。

FROM是基础镜像

CMD是容器创建时候默认的启动命令

CMD是一个数组固定格式

每个参数数组里面元素

/bin/ls   ==>  CMD ["/bin/ls"]
/bin/ls -l -a  ==>  CMD  ["/bin/ls","-l","-a"]
#   ${ENTRYPOINT}  是命令
#   ${@-${CMD}}   是参数
#   ${@} 是所有的参数选项之和
#   $1是第一个参数 
#   $2 是第二个参数
#   ...
#   $n 是第n个参数
#   $@ 是所有的参数之和
#   ${@-} 代表前面的变量没有设置
 ~]# echo  ${AA} ~]# echo  ${AA-abc}
abc
#   减号"-"后面代表,前面没有设置的时候,用这个参数
 ~]# AA=123
 ~]# echo  ${AA-abc}
123
#   如果AA设置了,就用设置的值
 ~]# unset AA
 ~]# echo  ${AA-abc}
abc
#   如果把AA设置的值删了,就用减号后面的值了
#   所以
#   ${@-${CMD}的意思就是,如果设置参数了,就用参数,如果没有设置,就用CMD
#   这个CMD就是默认的启动参数,如果没有设置,就用CMD写的命令来启动
#   ENTRYPOINT是,如果设置了,那么CMD就变成选项了。
#   ENTRYPOINT一旦设置了就必须执行
~]# cat  img1 
#!/bin/bash
CMD="/bin/ls -l"
ENTRYPOINT="echo"
${ENTRYPOINT} ${@-${CMD}}
~]# ./img1
/bin/ls -l
 ~]# ./img1  id
id
#  ENTRYPOINT设置echo命令后面CMD变成参数输出屏幕
#  所以ENTRYPOINT设置必须执行
~]# cat myimg/Dockerfile 
FROM  mylinux:latest
ENTRYPOINT ["echo"]
CMD ["/bin/ls", "-l"]
# FROM ENTRYPOINT CMD这三个指令dockerfile里面核心指令

文件扩展名为

.tar

.tar.gz

.tar.bz2

.tar.xz

.tar.tgz

这些类型文件

ADD指令这些文件解压

COPY指令不会解压这些文件

镜像时候所有文件都要放在镜像那个目录里面也就是Dockerfile所在目录

指令

说明

FROM

指定基础镜像

ENTRYPOINT

默认容器启动命令

CMD

有ENTRYPOINT时,CMD是启动参数;没有ENTRYPOINT时,CMD是启动命令;

可以容易被docker run 命令覆盖参数,比如:docker run myimage echo "Good!"

ADD

文件拷贝容器自动解压容器联网下载文件比如 ADD http://www.abc.com/abc.tar /tmp/

COPY

文件拷贝容器解压容器联网不能下载

RUN

容器内执行命令可以多条比如RUN touch file1RUN yum -y install nginx

USER

容器内切换用户相当于sudo -u user

ENV

设置环境变量某些指令需要环境变量才能正确执行比如

ENV PATH=${PATH}:/usr/local/nginx/sbin   # 指令寻址变量拼接nginx可执行文件

ENV ETCDCTL_API=3

WORKDIR

指定工作目录,有些任务需要,比如ansible、编译./configure

EXPOSE

对外声明容器将要使用端口号和协议,方便健康检测程序进行检测

WORKDIR的用法,比如
RUN touch  f1
WORKDIR /tmp
RUN touch f2     # 在/tmp目录创建f2文件
#通过Dockerfile里面WORKDIR,也可以知悉软件比如源码编译安装nginx WORKDIR /usr/local/nginx

ENTRYPOINT和CMD的单独用法,和结合用法:

  • 只使用 CMD

    • CMD 指定的命令将作为容器启动时的命令。
    • 如果用户没有通过 docker run 指定其他命令,那么 CMD 指定的命令将被执行。
  • 只使用 ENTRYPOINT

    • ENTRYPOINT 指定的命令将作为容器启动时的主程序。
    • 如果用户没有通过 docker run 指定其他命令,那么 ENTRYPOINT 指定的命令将被执行。
    • 当你想定义一个不可轻易覆盖的主程序时,使用 ENTRYPOINT
    • 例如,一个数据库容器可能总是需要运行数据库服务,不允许用户轻易改变这一点。
    • ENTRYPOINT 不容易被覆盖,除非使用 --entrypoint 显式指定。
  • 结合使用 ENTRYPOINT 和 CMD

    • CMD 指定的内容将成为 ENTRYPOINT 指定命令的参数。
    • 如果用户通过 docker run 指定其他命令,这些命令将覆盖 CMD 指定的参数。
# apache镜像,用Dockerfile制作示例:
httpd]# cat Dockerfile 
FROM mylinux:latest
RUN  dnf -y  install  httpd php  && dnf clean all
RUN  sed  -ri -e 's,^Load,#&,'  -e  's,^#(.*mod_mpm_prefork.so)$,\1,'  /etc/httpd/conf.modules.d/00-mpm.conf
ADD  myweb.tar.gz  /var/www/html/
ENV  LANG=C
WORKDIR  /var/www/html
EXPOSE 80/tcp
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]docker build  -t  httpd:latest  httpd/


http://www.ppmy.cn/news/1529745.html

相关文章

【GitLab】安装和使用

安装 拉取gitlab镜像: docker pull gitlab/gitlab-ce:12.7.6-ce.0运行镜像容器: docker run -itd --name gitlab -p 443:443 -p 80:80 -p 222:22 --restart always -m 4GB -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/1og/gitlab …

【Android】模糊搜索与数据处理

【Android】模糊搜索与数据处理 本篇博客主要以根据输入内容动态获取城市为例进行讲解。 获取城市 这一部分主要是根据输入的信息去动态获取城市信息 首先定义了一个名为 NetUtil 的类,主要用于通过 HTTP 请求获取城市信息。 public class NetUtil {private stat…

【Text2SQL】DAIL-SQL阿里推出,在Spider取得了SOTA

论文解读:Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation 论文详细介绍了DAIL-SQL方法,这是一个针对Text-to-SQL任务的提示工程方法。这个方法旨在通过精心设计的提示(prompt engineering)来优化大型语…

Linux 基础入门操作 第九章 进程间通信之管道

第九章 进程间通信 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几 M 字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改&#xf…

【通信基础】精讲通信天线种类及CAN总线和集群关系

前言 在通信行业中,天线的种类非常多,涵盖了从简单的无线电天线到复杂的相控阵天线。这些天线的种类和形态各异,以满足不同频率、应用场景和通信需求。以下是一些主要的天线种类: 1. 通信天线种类 1.1 偶极子天线 (Dipole Ant…

切换到WDDM模式,Tesla M4可以用于本地显示输出了!

正文共:1333 字 21 图,预估阅读时间:2 分钟 上次安装完Tesla M4显卡之后(HPE服务器通过显卡直通安装Tesla M4,这算亮机成功了吗?),系统识别正常,但是不能用于显示&#x…

Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)

本阶段的任务 1.学会集群的操作概念 2.完成对Nginx的入门操作 3.使用Nginx实现集群和负载均衡 4.使用Nginx实现高可用的方案 目录 1.单体部署与集群部署 1.1单体部署的概念 1.2单体部署的优缺点 1.3集群部署的概念 1.4集群部署的优缺点 1.5集群部署需要注意的点 1.…

BOE(京东方)携故宫博物院举办2024“照亮成长路”公益项目落地仪式以创新科技赋能教育可持续发展

2024年9月20日,BOE(京东方)“照亮成长路”智慧教室落成暨百堂故宫传统文化公益课山西活动落地仪式在山西省太原市娄烦县实验小学隆重举行。自“照亮成长路”教育公益项目正式设立以来,BOE(京东方)持续以创新…