5 Docker flile

原文阅读:【巨人肩膀社区·专栏·分享】5 Docker flile

官方地址: https://docs.docker.com/reference/dockerfile/

bash 复制代码
vim busyboxfile 创建文件编写内容,容器分层,几个命令就几个层
FROM busybox
#标签 k=v格式 镜像的说明信息
LABEL maintainer="lqf" 

# CMD RUN 都可以取环境变量  ENV会被固化到config里面  运行期可以修改,构建的时候不允许修改
ENV parm=1234 
docker  run -it -e par=new111 nginx:v1  ENV参数:运行镜像时可以更改此属性的值
#-e只能修改env本身,构建期间确定好的值,无法修改,构建期间修改无效
docker run -it -e parm=new111  nginx:v1

# 构建参数 ARG  
#docker build命令构建镜像时,可以通过 --build-arg abc=777 
#选项来覆写Dockerfile中定义的ARG变量的默认值 
#多阶段构建中,--build-arg 定义的变量可以在多个阶段之间共享
ARG abc=666


#容器构建时候执行的命令 会以shell*的 /bin/sh -c 的方式运行,避免破坏shell字符串
RUN echo 111
RUN echo $parm
RUN echo $abc

#  exec方式  Docker会直接执行指定的可执行文件和参数,而不会通过shell进行变量展开
RUN ["echo","2222","$parm"]
RUN ["echo","$parm"]
RUN ["echo","$abc"]

#要使Exec形式也能取到环境变量的值,你需要利用shell来执行命令
RUN ["/bin/sh","-c","echo 2222 $parm"]


#ADD   上下文文件添加到镜像,下载链接会下载,压缩包会自动解压
ADD http://abc/a.txt  /diskfile/  放到这个文件下,/diskfile  是把下载的文件变成diskfile文件

RUN cd /diskfile
RUN ls -l  #这块还是列举当前目录,cd无效果 run没有上下文效果
RUN cd /diskfile && ls -l   #正确写法
#本地linux文件添加镜像里面去 (宿主机到镜像内)
#添加当前所有文件添加到app目录下,并解压 (docker  build  构建环境指定的就是.   所以就是当前目录的所有文件
ADD *.gz /app/    因为构建环境模式是当前环境,
# 这块*.不代表宿主机所有文件,而是当前位置的文件 即 ./

#USER 给容器开一个用户
USER redis:redis

USER 1000:1000

#COPY  上下文文件内容复制到镜像,不自动解压和下载 
# --chown=user:group
#以容器的用户  
RUN 开启一个redis账户  复制来的内容给redis用户所有权
COPY --chown=1000:1000  *.gz /app/ 

#WORKDIR    指定自己在哪个目录,不存在自动创建,
#为下面所有目录指定基础目录,多个WORKDIR可以嵌套
WORKDIR /opt/app

WORKDIR csv  相对路径  会叠加  即pwd= /opt/app/csv
WORKDIR /opt/lqf   进入容器会在这个目录下 
COPY *.txt ./  #复制到的是在app目录下

#VOLUME 挂载容器的指定文件夹,不存在就创建
#容器启动就会默认挂载这2个目录,匿名卷挂载
VOLUME ["/opt","/app"]  挂载后,下面对挂载目录的命令写入的内容就会弃用,操作无效




CMD 的三种写法:
CMD ["executable","param1","param2"] ( exec 方式, 首选方式)
CMD ["param1","param2"] (为ENTRYPOINT提供默认参数)
CMD command param1 param2 ( shell 形式)ENTRYPOINT 的两种写法:
ENTRYPOINT ["executable", "param1", "param2"] ( exec 方式, 首选方式)
ENTRYPOINT command param1 param2 (shell 形式)



# EXPOSE  暴露端口,只是声明,
# 运行 -P 随机分配端口,也会给这2个端口做随机分配
EXPOSE 2181
EXPOSE 306


#ENTRYPOINT   正常的入口 不可以修改  
ENTRYPOINT ping www.baidu.com  总是最后一个生效
ENTRYPOINT ["ping","baidu.com"]  推荐写法

#CMD   命令   后面可以改
CMD ["ping","baidu.com"] 推荐写法
CMD ping www.baidu.com  总是最后一个生效


ENTRYPOINT+CMD合在一起不能是错误的命令
docker run -it demo:v1 ping www.abc.com  可以修改cmd命令,ENTRYPOINT不能被修改
示例:
FROM ubuntu
ENTRYPOINT ["ping"]  # 设置容器启动时执行的命令
CMD ["www.baidu.com"]  # 提供 ENTRYPOINT 命令的默认参数
在这个 Dockerfile 中,容器启动时默认会执行 ping www.baidu.com。
但是,使用 docker run 时可以指定不同的参数:
docker run -it demo:v1 ping www.abc.com
这个命令会启动 demo:v1 镜像的容器,并执行 ping www.abc.com,
其中 www.abc.com 替换了 Dockerfile 中 CMD 指定的 www.baidu.com。




#容器启动时进行的命令
CMD ping www.baidu.com
#构建镜像  --no-cache  不用缓存   ./ 当前上下文环境,代表dockerfile所在的位置
# --progress=plain 输出更详细的信息,包括每一步的执行状态和输出
docker build -t my_busybox:v1 --no-cache -f ./busybox  ./

运行我们刚刚构建的镜像
docker run -d my_busybox:v1

[root@master dockerfile]# docker ps --no-trunc
CONTAINERID    IMAGE           COMMAND                              CREATED          STATUS          PORTS     NAMES
3b7d2a892101   my_busybox:v1   "/bin/sh -c 'ping  www.baidu.com'"   30 seconds ago   Up 29 seconds             practical_poitras
相关推荐
运维小文2 分钟前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 分钟前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Mr_Xuhhh7 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ8 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe9 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge9 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
久醉不在酒9 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
志凌海纳SmartX10 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总10 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿10 小时前
k8s 集群安装
云原生·容器·kubernetes