dockerfile学习
参考: https://www.cnblogs.com/rongba/articles/15206165.html https://blog.csdn.net/Alinlx/article/details/120860055
参考: https://www.runoob.com/docker/docker-dockerfile.html
参考 https://zhuanlan.zhihu.com/p/354542311(看这个)
dockerfile文件例子:---文件名就为 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 | FROM centos //继承至centos MAINTAINER lucax 指定创建者 ENV mypath /tmp //设置环境变量 WORKDIR $mypath //指定工作目录 RUN yum -y install vim //执行yum命令安装vim RUN yum -y install net-tools //执行yum命令安装net-tools EXPOSE 80 //对外默认暴露的端口是80 CMD /bin/bash //CMD 容器启动命令,在运行容器的时候会自动执行这行命令,比如当我们 docker run -it centos 的时候,就会直接进入bash |
生成镜像命令:
cd到dockerfile目录下执行命令
1 | docker build -t lucax:1.0 . |
上面命令bulid的时候提示 : no such file or directory 使用下面指定dockerfile文件路径即可
用 -f 参数手动指定Dockerfile文件位置就可以解决问题
docker build -f docker/Dockerfile -t [hub.docker.com名称]/[项目名称]:[项目版本] .
From 和 RUN
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式: (个人理解就是基于FROM的系统执行命令在build的时候)
RUM 意思是 终端执行
如:
1 2 3 4 | FROM centos RUN yum -y install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gzd |
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。上面这么写的话会产生多层使得镜像变大,可以采用链式写法&&拼接,只会产生一层:
1 2 3 4 | FROM centos RUN yum -y install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz |
CMD 和 ENTRYPOINT
CMD
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
CMD 和 ENTRYPYPOINT 区别 见: https://blog.csdn.net/qq_45300786/article/details/103947527(必看)
注意:
如果entrypoint 使用的是shell模式, 即写法上不带中括号, 那么不管是否存在cmd命令, 容器在执行时,都只是执行 entrypoint 的命令, docker run时携带的参数也会被忽略。
如果entrypoint 使用的是exec模式, 即写法上带有中括号, 容器在执行时,会追加cmd命令(如果存在cmd指令), docker run时携带的参数也会被执行。
不管cmd使用什么模式,都会被docker run携带的参数覆盖掉(如果存在)
entrypoint使用的是exec模式,cmd也应该使用exec模式
CMD ["/bin/echo", "this is a echo test"] 可执行
CMD /bin/echo this is a echo test && /bin/echo this is a echo test2 可执行
拼接方式
ENTRYPOINT ["/bin/echo"]
CMD ["我是谁"]
如果
docker run ubuntu
就会执行/bin/echo 我是谁
如果
docker run ubuntu 替换参数
就会执行/bin/echo 替换参数 //把CMD的参数替换掉
如果用了ENTRYPOINT CMD 就是他的参数而已
如你指定:
CMD ["/bin/echo", "this is a echo test"]
docker run ec
就会输出: this is a echo test
注意点:
docker run命令如果指定了参数会把CMD里的参数覆盖:
如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it只是docker 的参数,而不是容器的参数。
同样是上面的ec镜像启动:
docker run ec /bin/echo hello
就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。
如果镜像一启动就停了,可以启动时加上 bash 直接进入容器。
容器run的时候其实先执行ENTRYPYPOINT的命令,如果docker run 没有带参数 那么CMD的命令跟着ENTRYPYPOINT 拼接,
如果docker run 带参数启动,那么CMD的命令不会执行
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
1 2 3 | ENTRYPOINT /opt/tomcat/apache-tomcat-9.0.50/bin/startup.sh && /bin/bash CMD /opt/tomcat/apache-tomcat-9.0.50/bin/startup.sh && /bin/bash |
还可以定参传参数 2者配合等,见菜鸟教程
VOLUME
数据卷挂载---(设置外部挂载的目录)
VOLUME /bin && /user (猜可以这么写有空研究下)
VOLUME ["/bin","/user"]
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
EXPOSE
EXPOSE 80 && 81 (猜可以这么写有空研究下)
EXPOSE [80,81]
WORKDIR
WORKDIR /tmp
java的环境变量
1 2 3 | ENV JAVA_HOME /opt/jdk/jdk1.8.0_181 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin |
别人家设置一个java环境的dockerfile的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #依赖镜像名称和ID FROM daocloud.io/library/centos:6.8 #指定镜像创建者信息 MAINTAINER alinlx #切换工作目录 ADD jdk-8u181-linux-x64.tar.gz /opt/jdk ADD apache-tomcat-9.0.50.tar.gz /opt/tomcat #配置java环境变量 ENV JAVA_HOME /opt/jdk/jdk1.8.0_181 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin RUN chmod +x /opt/tomcat/apache-tomcat-9.0.50/bin/*.sh EXPOSE 8080 ENTRYPOINT /opt/tomcat/apache-tomcat-9.0.50/bin/startup.sh && /bin/bash |
别人搭建java环境 https://www.cnblogs.com/52lxl-top/p/9877202.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通