|
|
|
@ -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 <key>=<value> <key>=<value> <key>=<value>
|
|
|
|
|
或者
|
|
|
|
@ -331,8 +329,6 @@ LABLE <key>=<value>
|
|
|
|
|
|
|
|
|
|
> 一个镜像中可以有多个标签。可以在一行上指定多个标签,这在 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 <name>[=<default value>]
|
|
|
|
|
> ```
|
|
|
|
|
>
|
|
|
|
|
> ```dockerfile
|
|
|
|
|
> # 构建时使用
|
|
|
|
|
> docker build --build-arg name=value --build-arg name2=value2 -t study.dockerfile.arg:latest .
|
|
|
|
|
> ```
|
|
|
|
|
>
|
|
|
|
|
> ARG定义了一个变量,用户可以在构建时使用该标志的命令将该变量传递给构建器。如果用户指定了未在 Dockerfile 中定义的生成参数,则生成将输出警告。
|
|
|
|
|
>
|
|
|
|
|
> <mark>注意</mark>:EVN定义的变量是在构建时和容器内均可用,ARG变量只能在构建时使用,容器内部是不存在的。也是唯一一个可以使用在FROM命令之前的命令
|
|
|
|
|
>
|
|
|
|
|
> <mark>范围</mark>:变量从 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
|
|
|
|
|
|
|
|
|
|
+ 小结
|
|
|
|
|