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

posted @   凯宾斯基  阅读(74)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示