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
相关推荐
liuzhenghua665 分钟前
Python任务调度模型
java·运维·python
黎相思8 分钟前
应用层自定义协议与序列化
运维·服务器·网络
测试开发Kevin1 小时前
详解Jenkins Pipeline 中git 命令的使用方法
运维·jenkins
什么半岛铁盒1 小时前
Linux线程与进程关系及底层实现
java·linux·运维
yunken281 小时前
docker容器保存为不依赖基础镜像的独立镜像方法
java·docker·容器
langmeng1102 小时前
使用docker在3台服务器上搭建基于版本redis 6.x的一主两从模式
运维·redis·docker·容器·集群
jllllyuz2 小时前
如何为服务器生成TLS证书
运维·服务器·数据库
简朴-ocean2 小时前
如何删除linux空的文件夹
linux·运维·服务器
leblancAndSherry3 小时前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins
半桔3 小时前
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
linux·运维·服务器·面试·centos