编写规则:
#注释写一些标注或者是作者
FROM
FROM指令是最重要的一个且必须为 Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境 .
FROM repository[:tag]
COPY
如果src是目录,其内部文件或者子目录会被递归复制,但src目录自身不会被复制
如果指定了多个src,或在src中使用了通配符,则dest必须是一个目录,且dest目录必须以/结尾
如果dest事先不存在,它将会被自动创建,这包括其父目录路径
COPY src … dest
WORKDIR
workdir为工作目录,指当前容器环境的工作目录,用于为 Dockerfile中所有的 RUN、CMD、ENTRYPOINT、COPY和 ADD指定设定工作目录
WORKDIR dirpath
VOLUME
定义卷,只能是docker管理的卷,,VOLUME为容器上的目录,用于在 image中创建一个挂载点目录,以挂载 Docker host上的卷或其它容器上的卷
VOLUME mountpoint
EXPOSE
暴露指定端口,用于为容器打开指定要监听的端口以实现与外部通信
EXPOSE port[protocol] [port[protocol] …]
运行的时候docker -P来真正暴露
其中protocol用于指定传输层协议,可为 tcp或udp二者之一,默认为 TCP协议EXPOSE指令可一次指定多个端口,但是不能指定暴露为宿主机的指定端口,因为指定的宿主机端口可能已经被占用,因此这里使用随机端口
ENV
ENV用于为镜像定义所需的环境变量,并可被 Dockerfile文件中位于其后的其它指令(如 ENV、ADD、COPY等)所调用 ,即先定义后调用
调用格式为 $ variable_name或$ {variable_name}
ENV key value
AGRS
在编译是使用的变量,编译完成后删除。
RUN
RUN用于指定 docker build过程中运行的程序,其可以是任何命令,但是这里有个限定,一般为基础镜像可以运行的命令,如基础镜像为centos,安装软件命令为yum而不是ubuntu里的apt-get命令
RUN和CMD都可以改变容器运行的命令程序,但是运行的时间节点有区别,RUN表示在docker build运行的命令,而CMD是将镜像启动为容器运行的命令。因为一个容器正常只用来运行一个程序,因此CMD一般只有一条命令,如果CMD配置多个,则只有最后一条命令生效。而RUN可以有多个。
RUN command
CMD语法
CMD command或
CMD [“executable”,“param1”,“param2”]或
CMD[“param1”,“param2”]
ENTRYPOINT
类似 CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
与CMD不同的是,由 ENTRYPOINT启动的程序不会被 docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给 ENTRYPOINT指定指定的程序 .不过, docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
ENTRYPOINT command
ENTRYPOINT [“excutable”,“param1”,“param2”]
指定运行用户
USER |
FROM harbor.sxftwork.com/pub_images/javabase:1.0.0
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
COPY /data/webapps/app.jar
USER root
RUN chown -R work:work /data/webapps/
RUN chown work:work /usr/local/bin/entrypoint.sh
USER work
ENTRYPOINT ["/bin/bash","/usr/local/bin/entrypoint.sh"]
EXPOSE 18902
#!/bin/bash
ls -al /data/webapps/
echo $DEPLOY_ENV
RUN_CMD="java -Xmx1024m ....... -Dspring.profiles.active=$DEPLOY_ENV -jar /data/webapps/app.jar"
echo $RUN_CMD
eval $RUN_CMD eval将字符串当作命令执行