PHP经验分享程序员PHP开发

Docker 入门教程之Dockerfile详解

2021-08-11  本文已影响0人  phpworkerman
什么是Dockerfile

Dockerfile 是一个用来自动化构建镜像的文本文件,里面包含了许多构建镜像的指令。

Dockerfile 的格式
# 这是注释
FROM centos
RUN echo "hello world"

以下命令等同于上边的

          # 这是加空格的注释
          FROM centos
      # 这是加空格的命令
      RUN echo "hello world"
  1. 指令 # directive=value 需要写在 dockerfile 文件开头,不然会被当成普通注释
  2. 只能写入一次,多次会无法生效
  3. 空格不会对解析器指令产生影响
  4. 不区分大小写,但推荐小写
ENV path=/usr/share
ENV real_path=$path
.dockerignore 文件

该文件用来编写镜像打包时的文件忽略规则,由注释和文件匹配规则构成,类似 Git 的忽略文件

# 这是一个注释
*/temp*
*/*/temp*
!/temp/logo
temp?
Dockerfile 指令
# This is a demo
ARG  CODE_VERSION=20.04
FROM ubuntu:${CODE_VERSION}
LABEL version="1.0" \
description="测试镜像" \
org.opencontainers.image.authors="phpworkerman"
EXPOSE 8081/tcp
ENV DIRPATH=/etc
WORKDIR $DIRPATH
RUN pwd
ADD test.conf .
CMD ["bash"]
ENTRYPOINT["ls"]

ARG:可定义或是接收外部传入的变量,是唯一可以在 FROM 前使用的指令,外部传入时需要使用 --build-arg,例如:docker build --build-arg CODE_VERSION=21.04
FROM:指定基础镜像,构建时作为做底层来使用,必须填写,一个 Dockefile 可出现多次,创建多个镜像,或指定其中的依赖关系
LABEL:在镜像中添加元数据,格式为 key=value,可添加多个,LABEL值可继承父级镜像,如果KEY存在相同的,后者会进行覆盖
EXPOSE:通知 Docker 容器在运行时监听的指定端口,并不是实际进行端口分发,默认 TCP 协议,也可指定 UDP 协议
ENV:定义变量,格式为 key=value,另一种语法形式为 ENV key value,忽略等号
WORKDIR:设置工作目录,如果目录不存在会自动创建,可以设置多个,当前如果是相对路径,那么将会根据于上个路径进行定位
ADD:添加指定文件、文件夹或远程文件到目标目录,如果目标目录为相对路径,根据 WORKDIR 路径来执行
COPY:复制指定文件、文件夹或远程文件到目标目录,如果目标目录为相对路径,根据 WORKDIR 路径来执行
RUN:在当前镜像的新层中执行任何命令,并提交结果。有两种执行格式,一种是 shell 命令 RUN pwd,另一种是 Docker 封装的命令格式以 json 为参数传递执行 RUN ["pwd"]
CMD:为容器执行命令提供默认值,有多个指令时,只会生效最后一个,在 执行容器生成命令 docker run 镜像 [命令],镜像后的命令会替换 CMD 指令
ENTRYPOINT:为容器执行命令提供默认值,在 Dockerfile 文件中必须包含一个 CMD 或 ENTRYPOINT 指令,如果两种指令同时存在 CMD 会做为 ENTRYPOINT 的参数来进行交互
MAINTAINER(已废弃) 作者信息已废弃,现在根据 LABEL 来指定

执行 Dockerfile 文件进行镜像打包
docker build -f /var/www/dockerfile -t phpworkerman/ubuntu:1.0 .

--file, -f 设置 Dockerfile 文件所在的路径
--tag, -t 设置新生成的镜像名称和标签
.(点)该符号代表打包时依赖的上下文目录,因为打包是通过 Docker Engine 来进行的,它无法直接获取宿主机的文件目录,所以只能选择把 Dockerfile 文件所在的目录一同发送给 Docker Engine 处理,这个时候 .dockerignore 文件设置的忽略规则就会生效,点代表的就是 Dockerfile 文件所在的目录

上一篇 下一篇

猜你喜欢

热点阅读