一、Dockerfile常用命令
FROM
指定基础镜像,Dockerfiel的第一条命令
格式: FROM <images> FROM <images>:<tag> 若使用第一种格式,则基础镜像的tag为latest
MAINTAINER
镜像维护者信息
格式:
MAINTAINER <name>
RUN
构建镜像时在镜像中运行的shell命令
格式: RUN <command> RUN ["executable", "param1", "param2"] 第一种格式(shell形式)默认使用/bin/sh -c 执行命令,推荐使用第一种格式 第二种格式(exec形式)使用exec执行命令 若想使用其他shell类型执行命令,请使用第二种格式即 RUN ["/bin/bash","-c","command"] 多条RUN命令可以合并,如: RUN command1 && command2 && command3
ENV
设置镜像的环境变量
格式: ENV <key> <value> ENV <key>=<value> ... 第一种格式一次只能设置一个环境变量 第二种可以设置多个环境变量,若需换行使用反斜杠()
EXPOSE
设置启动镜像时要暴露的端口,用于与外界交互
格式:
EXPOSE <port> [<port1>...]
VOLUME
申明容器挂载点
格式: VOLUME ["/path1/to/dir1","/path2/to/dir2"]
USER
指定启动镜像时运行用户
格式: USER <user>[:<usergroup>] USER <uid>[:<gid>]
使用用户之前请确保镜像中有该用户,创建用户可以 RUN groupadd -r 用户 && useradd -u uid -r -g 用户组 用户 使用USER指定用户后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户
WORKDIR
设置进入容器的默认目录
格式:
WORKDIR </path/to/workdir>
ADD
拷贝本地文件或目录到镜像中
格式: ADD <src> <dest> ADD ["<src>", "<dest>"] 用于支持包含空格的路径
src是Dockerfile文件所在的同一级目录或者同级目录的子目录路径 tar类型的文件会自动解压到dest目录下 注意: 1.src是个文件,且dest以 / 结尾, 则docker会把dest当作目录,会把src文件拷贝到dest目录下。 如果dest不存在,则会自动创建 2.src是个文件,且dest不以 / 结尾,则docker会把dest当作文件,会把dest文件替换为src文件。 如果dest不存在,则创建名为src的文件 3.src是个目录,且dest不存在,则docker会自动以dest创建一个目录,把src目录下的文件拷贝进来。 如果dest是个已经存在的目录,则docker会把src目录下的文件拷贝到dest下
COPY
拷贝本地文件或目录到镜像中
格式:
COPY <src> <dest> 与ADD功能相似,但是不能解压tar类型的文件
CMD
启动容器时执行的shell命令
格式: CMD ["executable","param1","param2"] (exec形式执行可执行文件,优先) CMD command param1 param2 (shell形式执行命令) Dockerfile中只能有一条CMD命令,如果指定多条,只有最后一条生效,推荐使用第一种格式 第二种格式默认使用/bin/sh -c 执行命令 若要改变shell类型,请使用第一种格式即 CMD ["/bin/bash","-c","command","param1","param2"] CMD会被docker run命令行指定的参数所覆盖
ENTRYPOINT
启动容器时执行的shell命令
格式: ENTRYPOINT ["executable","param1","param2"] (exec形式执行可执行文件,优先) ENTRYPOINT command param1 param2 (shell形式执行命令) 第二种格式默认使用/bin/sh -c 执行命令 Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效 同CMD类似,但是不会被docker run命令行指定的参数所覆盖,可以被docker run --entrypoint 覆盖 若Dockerfile中既有CMD(通常位置会在ENTRYPOINT之后)又有ENTRYPOINT,则CMD会被当做参数传递给ENTRYPOINT
ARG
构建镜像时,指定变量
格式: ARG <name> ARG <name>=<default value> 第一种格式:变量值可以在docker build --build-arg name=value时指定
二、制作镜像
命令: Dockerfile在当前目录下: docker build -t 镜像名:tag . Dockerfile不在当前目录下(-f 指定Dockerfile文件路径,xxx/为构建docker镜像时的上下文路径,即该目录下的文件可以在Dockerfile中COPY/ADD): docker build -t 镜像名:tag -f xx/Dockerfile xxx/
基于centos:7的tomcat8.5.53镜像制作
Dockerfile文件内容
#指定基础镜像 FROM centos:7 #指定运行的用户 USER root #拷贝包到镜像指定目录 ADD jdk-8u241-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.53.tar.gz /app #设置工作目录 WORKDIR /app/apache-tomcat-8.5.53 #设置环境变量 ENV JAVA_HOME=/usr/local/jdk1.8.0_241 JRE_HOME=/usr/local/jdk1.8.0_241/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib ENV PATH=${JAVA_HOME}/bin:${PATH} #申明挂载点 VOLUME ["/app/apache-tomcat-8.5.53/log","/app/apache-tomcat-8.5.53/conf","/app/apache-tomcat-8.5.53/webapps"] #暴露容器端口 EXPOSE 8080 #进入容器时启动tomcat ENTRYPOINT ["bin/catalina.sh","run"]#指定基础镜像 FROM centos:7 #指定运行的用户 USER root #拷贝包到镜像指定目录 ADD jdk-8u241-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.53.tar.gz /app #设置工作目录 WORKDIR /app/apache-tomcat-8.5.53 #设置环境变量 ENV JAVA_HOME=/usr/local/jdk1.8.0_241 JRE_HOME=/usr/local/jdk1.8.0_241/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib ENV PATH=${JAVA_HOME}/bin:${PATH} #申明挂载点 VOLUME ["/app/apache-tomcat-8.5.53/log","/app/apache-tomcat-8.5.53/conf","/app/apache-tomcat-8.5.53/webapps"] #暴露容器端口 EXPOSE 8080 #进入容器时启动tomcat ENTRYPOINT ["bin/catalina.sh","run"]
Dockerfile文件所在目录下的内容
制作镜像