FROM:指定基础镜像
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
LABEL:指定镜像元数据, 如:镜像作者等
LABEL <key>=<value><key>=<value><key>=<value>...
RUN:执行shell命令
每一个run指令都会建立一层,所以尽可能合并成一条指令
ADD:复制和解包文件
可认为是增强版的COPY,不仅支持COPY,还支持解缩。可以将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
- 如果src是目录,只复制目录中的内容,而非目录本身
- 如果src是本地打包或压缩文件,如gzip, bzip2 ,xz ,将解包
- 如果src是一个 URL ,下载后的文件权限自动设置为 600
COPY:复制本地主机的文件到容器中
- 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则
- 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
- 如果是目录,只复制目录内容,而非目录本身
# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
CMD:容器启动命令
指定启动容器时默认执行的命令,即:如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么就会使用执行CMD指定的默认的命令
每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
如果用户启动容器时指定了运行的命令,如:docker run xxx /bin/bash,则/bin/bash 会覆盖 CMD 指定的命令
NTRYPOINT:入口点
功能类似于CMD,配置容器启动后执行的命令及参数,并且不可被 docker run 提供的参数覆盖,而是追加
如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数
可以通过docker run –entrypoint 参数在运行时替换
使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效
ENV:设置环境变量
指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持
ENV <key><value>
ENV <key>=<value>...
ARG:设置构建参数
ARG <name>[=<default value>]
示例
USER ${user:-some_user}
ARG user
USER $user
docker build --build-arg user=what_user .
#
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
EXPOSE:暴露端口
EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射
在启动容器时需要通过 -P 或-p ,Docker 主机会分配一个端口转发到指定暴露的端口,才可以使用
EXPOSE 80/tcp `80/udp`
STOPSIGNAL:退出容器的信号
USER:指定当前用户
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
当服务不需要管理员权限时,可以通过该命令指定运行用户
这个用户必须是事先建立好的,否则无法切换
要临时获取管理员权限可以使用 gosu,而不推荐 sudo
VOLUME:挂载点
WORKDIR:指定工作目录
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内的默认目录
ONBUILD:子镜像引用父镜像的指令
新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。
.dockerignore文件
与.gitignore文件类似,生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
LABEL <key>=<value> <key>=<value> <key>=<value> ...
ENV <key1>=<value1> <key2>=<value2>...
RUN groupadd -r mysql && useradd -r -g mysql mysql
USER mysql
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN ["/bin/bash", "-c", "echo hello world"]
COPY hom* /mydir/ COPY hom?.txt /mydir/
VOLUME ["<容器内路径1>", "<容器内路径2>"...]
VOLUME <路径>
CMD [ "curl", "-s","https://ip.cn"]
# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径
CMD ["executable","param1","param2"]
# 提供给 ENTRYPOINT 的默认参数;
CMD ["param1","param2"]