实战Dockerfile
前言
博主语录:一文精讲一个知识点,多了你记不住,一句废话都没有
经典语录:别在生活里找你想要的,要去感受生活里发生的东西
Dockerfile基础知识已经在上一篇做了详细介绍,如果还不是很清楚的同学可以点击传送门再复习一遍。
传送门:【云原生 | Docker篇】深入Dockerfile_Lansonli的博客-CSDN博客
以下是实战经典十例,反复练习,可玩转Dockerfile
运行实例命令
# 修改dockerfile文件 vim Docderfile # 构建容器看执行过程 docker build --no-cache -t demo:test -f Dockerile . #传入构建参数 docker build --no-cache --build-arg param="11 22 33" msg="aa bb cc" -t demo:test -f Dockerfile2 . #进入容器控制台 docker exec -it mydemo1 /bin/sh 第一例、这是我第一个Dockerfile # 这是我第一个Dockerfile
FROM alpine # 给镜像加个标签 LABEL maintainer="lanson @ dd" \ abc=def \ aaa=bbb cccc=ddd # 运行的指令,安装了软件,修改了文件,默认是用id=0 也就是root,这个基础系统的root用户 # 代表镜像构建过程中运行的命令。 RUN echo 11111
# 镜像启动如果要运行很长命令才行,容器启动执行的命令 ## 1、准备一个sh文件,让镜像启动运行sh文件(大多镜像操作) ## 2、直接在CMD的位置写即可 CMD sleep 10;echo success
第二例、ARG指令和ENV指令简单使用
# 不可以引用多个
FROM alpine LABEL maintainer="llanson @ dd" \ abc=def \ aaa=bbb cccc=ddd
#指定构建参数【构建时】
ARG aaa=aaaa
#指定环境变量【为RUN以及CMD指定环境变量的】
ENV parm=11111
# shell* 形式; bash -c "echo 11111"
RUN echo $parm
# exec 形式。$parm 默认拿不到ENV
RUN ["echo","$aaa"] # 错误语法 RUN ["echo",'$parm'] # 错误语法 RUN ["echo",$parm]
# 错误语法。NOT FOUND(取不出环境变量【ENV】,ARG也是取不出)
#RUN ["echo",'${aaa}'] #RUN ["echo",${parm}]
#都是可以启动容器的命令有什么不同
#CMD sleep 1;echo $parm;echo $aaa;
# 都是可以启动容器的命令有什么不同
ENTRYPOINT sleep 1;echo $parm;
第三例、ARG指令可任意位置定义
#可以在任意位置定义,并在以后取值使用,
#使用--build-arg version=3.13 改变;以我们传入的为准
ARG version=3.13.4 # 3.13 FROM alpine:$version LABEL maintainer="lanson" a=b \ c=dd
#构建期+运行期都可以生效;但是只能在运行期进行修改
#怎么修改:构建期修改和运行期修改
#构建期不能改 ENV的值
#运行期:docker run -e app=atguigu 就可以修改
ENV app=itdachang
##测试构建期间生效
RUN echo $app RUN echo $param
# 定义以后的剩下环节(不包括运行时)能生效:取值$param;
#可以在构建时进行变化,docker build
# ARG不像ENV不能并排写
ARG param=123456 ARG msg="hello docker"
#构建时期我们会运行的指令(根据Dockerfile创建一个镜像的整个过程时期)
RUN echo 11111 RUN echo $param RUN echo $msg
#运行时期我们会运行的指令(根据之前创建的镜像启动一个容器,容器启动默认运行的命令)
#(docker run/docker start) # CMD和ENTRYPOINT` 都是指定的运行时的指令 CMD ["/bin/sh","-c","echo 1111;echo $param;echo app_${app}"]
第四例、ENV的坑--构建期间就已经确定好值
# env的坑
FROM alpine # ARG msg=hello
# # ENV肯定能引用ARG
# ENV name=${msg} # RUN echo ${name} # RUN echo ${msg}
# ENV只能运行期改掉
ENV msg1=hello ENV msg2=$msg1
# 以上构建期间就已经确定好值了;ENV持久化问题。
RUN echo ${msg1} RUN echo ${msg2}
# msg1=msg2没问题;如果我运行期修改了msg1=66666的值,请求msg1;msg2输出什么
# 结果输出: 6666 hello; 传值不是传引用???原因:
# docker build的时候,env环境的信息会固化,直接在镜像配置里面就已经写死,msg1=hello,msg2=hello。
# -e 真的只能修改当前env本身
# 为什么运行期间能用ENV定义的所有值,一定是ENV存在某个地方
CMD ["/bin/sh","-c","echo ${msg1};echo ${msg2};"]