- Dockerfile文件
FROM alpine:3.11.3
# 环境变量
ENV path /test
# 当前工作目录
WORKDIR $path
# 构建镜像时执行pwd命令
RUN pwd
# 拷贝文件至image
COPY test.txt .
# 构建镜像时执行cat命令
RUN cat test.txt
# 运行容器时执行命令
ENTRYPOINT ["echo", "hello"]
# ENTRYPOINT默认参数
CMD ["world"]
Dockerfile中的指令是相互独立的,互不影响
- docker build
从一个Dockerfile和一个context中构建一个image;
context:build命令指定目录的所有文件(递归,也可以是git仓库地址)
build命令会将context指定的文件都发送给docker daemon,可以在context根目录下添加.dockerignore文件,忽略不需要的文件和目录
Dockerfile文件默认位于context根目录下,也可以通过-f指定
Dockerfile指令
- FROM
拉取base image - RUN
在构建image(docker build)时运行一条命令,可以有多个RUN
# 第一种格式:shell form 格式
RUN <command>
# 第二种格式:exec form 格式
RUN ["executable", "param1", "param2"]
- CMD
在运行镜像(docker run)时执行一条命令,Dockerfile中有且只有一个CMD生效:多个CMD只有最后一个生效
# 第一种格式:exec form 格式(推荐)
CMD ["executable","param1","param2"]
# 第二种格式:作为ENTRYPOINT的default parameters
CMD ["param1","param2"]
当ENTRYPOINT不存在时,CMD可作为单独的命令存在。当ENTRYPOINT存在时,CMD会被识别为ENTRYPOINT的默认参数。
无论哪种情况,CMD指定的参数都会被docker run时指定的运行参数覆盖。
- ENTRYPOINT
在运行镜像(docker run)时执行一条命令,Dockerfile中只有最后一个ENTRYPOINT生效,生效规则同CMD
# 推荐使用exec form格式,可由CMD指定默认参数
ENTRYPOINT ["executable", "param1", "param2"]
docker run有运行参数时:
CMD被覆盖,所有docker run运行参数追加至ENTRYPOINT指令后。
- ADD
添加文件至image
# src:host文件/目录;dest:image文件/目录
ADD <src>... <dest>
# 路径中含有空格
ADD ["<src>",... "<dest>"]
src必须在context下
- COPY
拷贝文件至image,类似ADD,可以看做ADD子集;-- 推荐使用(替代ADD)
ADD额外功能:src支持URL;支持压缩包(gzip, bzip2 or xz)自动解压,但不支持URL下载的压缩包自动解压;
- VOLUME
创建挂载点
# JSON array
VOLUME ["/var/log/", "/var/db"]
# plain string
VOLUME /var/log /var/db
需要在docker run时,通过-v或--mount指定 host directory
- ENV
设置环境变量
# 设置单个
ENV <key> <value>
# 批量设置
ENV <key>=<value> ...
可通过docker inspect来查看ENV
- WORKDIR
指定当前工作目录
WORKDIR /path/to/workdir
- EXPOSE
容器在运行时监听的端口
# 默认TCP协议
EXPOSE 8080
# 指定UDP协议
EXPOSE 8080/udp
需要在docker run时,通过-p来指定与主机端口的映射
- USER
指定当前用户
# 指定当前用户为root
USER root