Dockerfile 构建镜像

​ Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。一般而言, Dockerfile 主体内容分为四 部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。

​ Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM。一个声明以#字符开头则被视为注释。可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令

image-20210422191046184

FROM:基础镜像

1
2
3
4
5
6
7
格式
FROM image
FROM image:tag
FROM image@digest
eg:
FROM mysql:5.6
ps: tag或digest是可选的,如果不使用这两个值,会使用latest版本的基础镜像

MAINTAINER:维护者信息

1
2
3
4
格式:
MAINTAINER name
eg:
MAINTAINER SadnessPineapple

RUN

1
2
3
4
5
6
RUN 用于在镜像容器中执行命令,有以下两种命令执行方式
格式:
run command
eg:
RUN ["executable", "param1", "param2"] #executable:可执行的命令
run echo "nameserver 114.114.114.114"

ADD

1
2
3
4
5
将本地文件添加到容器中(tar类型的文件会自动解压)
格式:
ADD src dest
eg:
ADD hom* /mydir/ 将所有的文件添加到/mydir/下

COPY

1
2
3
4
5
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
格式:
COPY src dest
eg:
dest 为镜像中的绝对路径或者相对于WORKDIR的路径

CMD

1
2
3
4
5
构建容器后调用,也就是在容器启动时才进行调用,只能有一个,多个的话会被覆盖
格式:
CMD ["executable","param1","param2"]
示例:
CMD ["/bin/bash"]

ENTRYPOINT

1
2
3
4
5
功能与CMD相似,但是不会被覆盖
格式:
ENTRYPOINT ["executable","param1","param2"]
示例:
ENTRYPOINT ["/bin/bash"]

LABEL

1
2
3
4
5
用于为镜像添加元数据
格式:
LABEL <key>=<value>
示例:
LABEL version="1.0" description="这是一个 Web 服务器" by="IT 笔录"

ENV

1
2
3
4
5
设置环境变量
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置 一个变量
示例:
ENV myName John Doe

EXPOSE

1
2
3
4
5
指定于外界交互的端口
格式:
EXPOSE <port>
示例:
EXPOSE 80 443

VOLUME

1
2
3
4
5
6
7
8
9
10
11
Docker的数据持久化主要有两种方式:
bind mount
volume
Docker的数据持久化即使数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。
格式:
VOLUME ["/path"] #将容器内的某个文件挂载出来
示例:
VOLUME ["/data"]

ps:
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

WORKDIR

1
2
3
4
5
6
7
工作目录,类似于 cd 命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
ps:通过 WORKDIR 设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用 docker run运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

ARG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
用于指定传递给构建运行时的变量
构建参数和ENV的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history还是可以看到所有值的。
Dockerfile中的ARG指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令docker build中用--build-arg<参数名>=<值>来覆盖。
灵活的使用ARG指令,能够在不修改Dockerfile的情况下,构建出不同的镜像。
ARG指令有生效范围,如果在FROM指令之前指定,那么只能用于FROM指令中

格式:
ARG参数名=默认值
eg:
ARG DOCKER_USERNAME=library

FROM ${DOCKER_USERNAME}/alpine

# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library

RUN set -x ; echo ${DOCKER_USERNAME}

FROM ${DOCKER_USERNAME}/alpine

# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library

RUN set -x ; echo ${DOCKER_USERNAME}

ONBUILD

1
2
3
4
5
6
7
格式: 
ONBUILD [INSTRUCTION]
eg:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

ps:当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

使用dockerfile启动

1
2
3
4
5
6
7
8
9
10
11
12
13
在Dockerfile文件这个目录下执行命令
docker build -t myubuntu:v1 .
docker:docker命令。

build:编译。

-t:镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag,参考docker build命令详解。

myubuntu:生成镜像的名称。

v1:生成镜像的版本号。

.:点符号“.”代表当前
1
2
3
4
5
6
7
8
9
10
11
12

c_id
from_clue="",
up_regno="",
regno="",
file = False,
report = False,
release = "判断",
remand = False,
write=True,
delete=True,
finish=True