From a7a8d81a8434e7ea13cea55b0d1a8596aa005ce3 Mon Sep 17 00:00:00 2001 From: bicijinlian Date: Thu, 13 Jan 2022 11:32:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Build/Dockerfile.ARG | 13 +++- Build/Dockerfile.ENV | 1 + Build/学习.md | 152 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 151 insertions(+), 15 deletions(-) diff --git a/Build/Dockerfile.ARG b/Build/Dockerfile.ARG index 75e4d0f..973519b 100644 --- a/Build/Dockerfile.ARG +++ b/Build/Dockerfile.ARG @@ -1,4 +1,11 @@ -# 注释: Dockerfile学习镜像 +# 注释: Dockerfile ARG命令 + FROM busybox -ENV file=app -ADD ./project/ /usr/local/$file/ \ No newline at end of file +ARG BaseWorkPath=/App/ +WORKDIR $BaseWorkPath +WORKDIR WebSites/ +WORKDIR ApiDemo/ +RUN pwd + +# docker build -f Dockerfile.ARG --build-arg CONT_IMG_VER=0.0.2 -t study.dockerfile.arg:latest -t study.dockerfile.arg:0.0.1 . +# docker run --rm -it study.dockerfile.arg \ No newline at end of file diff --git a/Build/Dockerfile.ENV b/Build/Dockerfile.ENV index 6c10bab..dd37352 100644 --- a/Build/Dockerfile.ENV +++ b/Build/Dockerfile.ENV @@ -1,6 +1,7 @@ # Deckerfile 环境变量测试 FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS EnvStudy ENV Dockerfile_version=0.0.2 +EXPOSE 80/TCP WORKDIR /app COPY WebApiPublish/ /app/ ENTRYPOINT ["dotnet", "DockerStudyApi.dll"] diff --git a/Build/学习.md b/Build/学习.md index 30cc5d0..68fc8e6 100644 --- a/Build/学习.md +++ b/Build/学习.md @@ -1,6 +1,6 @@ # Docker镜像学习 -> [官网文档](https://docs.docker.com/engine/reference/commandline/build/) [BuildFile]() +> [官网文档](https://docs.docker.com/engine/reference/commandline/build/) [BuildFile](https://docs.docker.com/engine/reference/builder/) ## 镜像构建流程 @@ -305,7 +305,7 @@ RUN ["/bin/sh", "-c", "echo exec方式执行后写入的内容 > demo2.txt"] # cat demo.txt 查看内容 ``` -+ CMD ++ CMD 命令 > CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换。 @@ -316,12 +316,10 @@ CMD ["param1","param2"](作为ENTRYPOINT 的默认参数) CMD command param1 param2 (外壳形式) ``` -+ LABLE ++ LABLE 标签 > 标签:将元数据添加到镜像,键值对的形式。值包含空格时,使用双引号;包含特殊字符时,使用转义符 `\` 这在K8S筛选、管理镜像时很有用。 - - ```textile LABEL = = = 或者 @@ -331,8 +329,6 @@ LABLE = > 一个镜像中可以有多个标签。可以在一行上指定多个标签,这在 Docker 1.10 之前,将减少最终映像的大小,但之后不需要如此。仍然可以选择在一条指令中以下列两种方式之一指定多个标签: - - ```dockerfile LABEL multi.label1="value1" multi.label2="value2" other="value3" ``` @@ -343,14 +339,146 @@ LABEL multi.label1="value1" \ other="value3" ``` -> 镜像会继承基本图像或父镜像中的标称,如果标签已存在但具有不同的值,则最近应用的值将覆盖之前设置的任何值。(类似CSS) - - - -> 使用如下命令查看镜像的标签。 +> 镜像会继承基本图像或父镜像中的标称,如果标签已存在但具有不同的值,则最近应用的值将覆盖之前设置的任何值。(类似CSS)使用如下命令查看镜像的标签。 > > ``` > docker image inspect --format='' imageName > -- format 遵循Go模板语法,使用需要学习,例如 > docker image inspect --format="{{.ContainerConfig.Labels}}" centos > ``` + ++ ENV 环境变量 + + ```dockerfile + # 语法 + ENV key=value key=value ... + + #替代语法,一次只能设置一个环境变量 + ENV key value + + # 可以设置多个环境变量, + # 含有空格等特殊内容的值用“”包括,可以使用转义符\进行转义和多行显示 + + # 环境变量位于构建阶段所有后续指令的环境中,并且可以在许多指令中以内联方式替换。 + # 该值将针对其他环境变量进行解释,因此,如果不转义,将删除引号字符。 + # 与命令行分析一样,引号和反斜杠可用于在值中包含空格。 + + # 镜像中的环境变量,从父镜像中层层继承。 + # 同名的环境变量,子镜像中的值覆盖父镜像中的仁,后续值覆盖前面的值。 + + # 容器会继承其镜像中的所有环境变量使用容器的系统变量 + # 对于容器内的应用程序来说,此环境变量相当于系统的环境变量;可以使用于多级配置项中。 + ``` + + ```dockerfile + # Deckerfile 环境变量测试,包含各种方式的配置示例 + + FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS EnvStudy + ENV Dockerfile_version=0.0.2 + WORKDIR /app + COPY WebApiPublish/ /app/ + ENTRYPOINT ["dotnet", "DockerStudyApi.dll"] + + # docker build -f Dockerfile.ENV -t study.dockerfile.env.webapi:latest -t study.dockerfile.env.webapi:0.0.1 . + # docker run --rm -p 5051:80 -d --name study.dockerfile.env.webapi.run1 study.dockerfile.env.webapi + # 查看日志 docker logs contain_id -f //使用 -f 参数 实时输出,ctl + c 退出(不影响容器运行) + ``` + ++ MAINTAINER 维护者 + +> 已弃用,可以使用 LABLE 代替 + ++ EXPOSE 显露端口 + +```dockerfile +# 该指令通知 Docker 容器在运行时侦听指定的网络端口。 +# 您可以指定端口是侦听 TCP 还是 UDP,如果未指定协议,则默认值为 TCP。 + +# EXPOSE实际上并未发布端口。 +# 它充当生成映像的人员和运行容器的人员之间的一种文档类型,用于发布哪些端口。 +# 若要在运行容器时实际发布端口,请使用 on 标志发布和映射一个或多个端口,或使用该标志发布所有公开的端口并将其映射到高阶端口 + +EXPOSE 80/tcp +EXPOSE 80/udp + + +# Docker Run 中使用真实端口与映射 +# P (大写-P参数 表示随机 小写-p参数 表示指定端口) + +docker run -P ... +docker run -p 80:80/tcp -p 80:80/udp ... +``` + ++ WORKDIR 工作目录 + + > 语法: + > + > ```dockerfile + > WORKDIR /path/to/workdir + > ``` + > + > WORKDIR 设置工作目录,其后的指令均在该目录中执行。如果目录不存在,则将创建它,即使它未在任何后续指令中使用。 + > + > WORKDIR 目录可以是绝对路径或相对路径。 + > + > 如果是相对路径,则该路径将相对于上一条WORKDIR指令的路径 + > + > ```dockerfile + > WORKDIR /a + > WORKDIR b + > WORKDIR c + > RUN pwd + > ``` + > + > 因为b c 均是相对目录,所以 pwd 的工作目录是 /a/b/c + > + > 可以使用已设置的变量、环境变量 + > + > ```dockerfile + > ENV DIRPATH=/path + > WORKDIR $DIRPATH/$DIRNAME + > RUN pwd + > ``` + ++ VALUE 数据卷 + + > value + ++ ARG 构建时变量 + + > 语法 + > + > ```dockerfile + > ARG [=] + > ``` + > + > ```dockerfile + > # 构建时使用 + > docker build --build-arg name=value --build-arg name2=value2 -t study.dockerfile.arg:latest . + > ``` + > + > ARG定义了一个变量,用户可以在构建时使用该标志的命令将该变量传递给构建器。如果用户指定了未在 Dockerfile 中定义的生成参数,则生成将输出警告。 + > + > 注意:EVN定义的变量是在构建时和容器内均可用,ARG变量只能在构建时使用,容器内部是不存在的。也是唯一一个可以使用在FROM命令之前的命令 + > + > 范围:变量从 Dockerfile 中定义的行开始生效,而不是从命令行或其他地方的自变量使用开始。ARG变量,在定义它的构建阶段结束时超出范围。要在多个阶段使用变量,每个阶段都必须包含 ARG 指令。 + + ```dockerfile + # 注释: Dockerfile ARG命令 + + FROM busybox + ARG BaseWorkPath=/App/ + WORKDIR $BaseWorkPath + WORKDIR WebSites/ + WORKDIR ApiDemo/ + RUN pwd + + # docker build -f Dockerfile.ARG --build-arg CONT_IMG_VER=0.0.2 -t study.dockerfile.arg:latest -t study.dockerfile.arg:0.0.1 . + # docker run --rm -it study.dockerfile.arg + ``` + ++ ONBUILD + ++ SHELL + ++ 小结