docker build


从 Dockerfile 构建镜像

Usage

$ docker build [OPTIONS] PATH | URL | -

有关此命令的可用OPTIONS的概述,请参阅选项部分.

Description

docker docker build命令从 Dockerfile 和"上下文"构建 Docker 镜像. 构建的上下文是位于指定PATHURL中的文件集. 构建过程可以引用上下文中的任何文件. 例如,您的构建可以使用COPY指令来引用上下文中的文件.

URL参数可以引用三种资源:Git 存储库、预打包的 tarball 上下文和纯文本文件.

Git repositories

URL参数指向 Git 存储库的位置时,该存储库充当构建上下文. 系统递归地获取存储库及其子模块. 不保留提交历史记录. 首先将存储库拉入本地主机上的临时目录. 成功后,该目录将作为上下文发送到 Docker 守护进程. 本地副本使您能够使用本地用户凭据、VPN 等访问私有存储库.

Note

如果URL参数包含一个片段,系统将使用git clone --recursive命令递归地克隆存储库及其子模块.

Git URL 在其片段部分接受上下文配置,用冒号 ( :分隔. 第一部分表示 Git 将检出的引用,可以是分支、标记或远程引用. 第二部分表示存储库中将用作构建上下文的子目录.

例如,运行此命令以使用分支container中名为docker的目录:

$ docker build https://github.com/docker/rootfs.git#container:docker

The following table represents all the valid suffixes with their build contexts:

构建语法后缀 提交使用 使用的构建上下文
myrepo.git refs/heads/master /
myrepo.git#mytag refs/tags/mytag /
myrepo.git#mybranch refs/heads/mybranch /
myrepo.git#pull/42/head refs/pull/42/head /
myrepo.git#:myfolder refs/heads/master /myfolder
myrepo.git#master:myfolder refs/heads/master /myfolder
myrepo.git#mytag:myfolder refs/tags/mytag /myfolder
myrepo.git#mybranch:myfolder refs/heads/mybranch /myfolder

Note

使用 BuildKit 作为构建器 ( DOCKER_BUILDKIT=1 ) 时,您不能指定构建上下文目录 ( 上面示例中的myfolder ). 在buildkit#1684中跟踪了对此功能的支持.

Tarball contexts

如果将 URL 传递给远程 tarball,则 URL 本身会发送到守护程序:

$ docker build http://server/context.tar.gz

下载操作将在运行 Docker 守护程序的主机上执行,该主机不一定与发出构建命令的主机相同. Docker 守护进程将获取context.tar.gz并将其用作构建上下文. Tarball 上下文必须是符合标准tar UNIX 格式的 tar 存档,并且可以使用"xz"、"bzip2"、"gzip"或"identity"(无压缩)格式中的任何一种进行压缩.

Text files

您可以在URL中传递单个Dockerfile或通过STDIN管道输入文件,而不是指定上下文. 要从STDIN管道Dockerfile

$ docker build - < Dockerfile

使用 Windows 上的 Powershell,您可以运行:

Get-Content Dockerfile | docker build -

如果您使用STDIN或指定指向纯文本文件的URL ,系统会将内容放入名为Dockerfile的文件中,并且任何-f--file选项都将被忽略. 在这种情况下,没有上下文.

默认情况下, docker docker build命令将在构建上下文的根目录中查找Dockerfile . -f--file选项允许您指定要使用的替代文件的路径. 这在同一组文件用于多个构建的情况下很有用. 路径必须指向构建上下文中的文件. 如果指定了相对路径,则将其解释为相对于上下文的根.

在大多数情况下,最好将每个 Dockerfile 放在一个空目录中. 然后,仅将构建 Dockerfile 所需的文件添加到该目录. 为了提高构建的性能,您也可以通过将.dockerignore文件添加到该目录来排除文件和目录. 有关创建的信息,请参阅.dockerignore 文件.

如果 Docker 客户端失去与守护程序的连接,则构建被取消. 如果您使用CTRL-c中断 Docker 客户端或 Docker 客户端因任何原因被终止,则会发生这种情况. 如果构建发起的拉取在构建被取消时仍在运行,则拉取也会被取消.

有关此命令的使用示例,请参阅下面的示例部分.

Options

名称,简写 Default Description
--add-host 添加自定义主机到 IP 映射 (host:ip)
--build-arg 设置构建时变量
--cache-from 要考虑作为缓存源的图像
--cgroup-parent 容器的可选父 cgroup
--compress 使用 gzip 压缩构建上下文
--cpu-period 限制 CPU CFS(完全公平调度器)周期
--cpu-quota 限制 CPU CFS(完全公平调度器)配额
--cpu-shares , -c CPU 份额(相对权重)
--cpuset-cpus 允许执行的 CPU (0-3, 0,1)
--cpuset-mems 允许执行的 MEM (0-3, 0,1)
--disable-content-trust true 跳过图像验证
--file , -f Dockerfile 的名称(默认为 'PATH/Dockerfile')
--force-rm 始终移除中间容器
--iidfile 将图像 ID 写入文件
--isolation 容器隔离技术
--label 为图像设置元数据
--memory , -m 内存限制
--memory-swap 交换限制等于内存加上交换:'-1' 启用无限交换
--network Set the networking mode for the RUN instructions during build
--no-cache 构建镜像时不要使用缓存
--output , -o API 1.40+
输出目的地(格式:type=local,dest=path)
--platform API 1.40+
如果服务器支持多平台,则设置平台
--progress auto 设置进度输出类型(auto、plain、tty). 使用 plain 显示容器输出
--pull 始终尝试拉取更新版本的图像
--quiet , -q 成功时禁止构建输出并打印图像 ID
--rm true 成功构建后移除中间容器
--secret 公开给构建的秘密文件(仅当 BuildKit 启用时): id=mysecret,src=/local/secret
--security-opt Security options
--shm-size /dev/shm 的大小
--squash 实验(守护进程)
将新建层压缩成一个新层
--ssh 要公开给构建的 SSH 代理套接字或密钥(仅当 BuildKit 启用时)(格式:默认|<id>[=<socket>|<key>[,<key>]])
--stream 流附加到服务器以协商构建上下文
--tag , -t 名称和可选的"名称:标签"格式的标签
--target 将目标构建阶段设置为构建.
--ulimit 限制选项

Examples

Build with PATH

$ docker build .

Uploading context 10240 bytes
Step 1/3 : FROM busybox
Pulling repository busybox
 ---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2/3 : RUN ls -lh /
 ---> Running in 9c9e81692ae9
total 24
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 bin
drwxr-xr-x    5 root     root        4.0K Oct 19 00:19 dev
drwxr-xr-x    2 root     root        4.0K Oct 19 00:19 etc
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 lib
lrwxrwxrwx    1 root     root           3 Mar 12  2013 lib64 -> lib
dr-xr-xr-x  116 root     root           0 Nov 15 23:34 proc
lrwxrwxrwx    1 root     root           3 Mar 12  2013 sbin -> bin
dr-xr-xr-x   13 root     root           0 Nov 15 23:34 sys
drwxr-xr-x    2 root     root        4.0K Mar 12  2013 tmp
drwxr-xr-x    2 root     root        4.0K Nov 15 23:34 usr
 ---> b35f4035db3f
Step 3/3 : CMD echo Hello world
 ---> Running in 02071fceb21b
 ---> f52f38b7823e
Successfully built f52f38b7823e
Removing intermediate container 9c9e81692ae9
Removing intermediate container 02071fceb21b

此示例指定PATH. ,所以本地目录中的所有文件都得到tar d 并发送到 Docker 守护进程. PATH指定在哪里可以找到 Docker 守护程序上构建的"上下文"文件. 请记住,守护程序可以在远程机器上运行,并且不会在客户端(您正在运行docker build的地方)对 Dockerfile 进行解析. 这意味着PATH中的所有文件都会被发送,而不仅仅是 Dockerfile 中列出的ADD文件.

当您看到"Sending build context"消息时,将上下文从本地机器传输到 Docker 守护进程是docker客户端的意思.

如果您希望在构建完成后保留中间容器,则必须使用--rm=false . 这不会影响构建缓存.

Build with URL

$ docker build github.com/creack/docker-firefox

这将克隆 GitHub 存储库并将克隆的存储库用作上下文. 存储库根目录下的 Dockerfile 用作 Dockerfile. 您可以使用git://git@方案指定任意 Git 存储库.

$ docker build -f ctx/Dockerfile http://server/ctx.tar.gz

Downloading context: http://server/ctx.tar.gz [===================>]    240 B/240 B
Step 1/3 : FROM busybox
 ---> 8c2e06607696
Step 2/3 : ADD ctx/container.cfg /
 ---> e7829950cee3
Removing intermediate container b35224abf821
Step 3/3 : CMD /bin/ls
 ---> Running in fbc63d321d73
 ---> 3286931702ad
Removing intermediate container fbc63d321d73
Successfully built 377c409b35e4

这会将 URL http://server/ctx.tar.gz发送到 Docker 守护程序,后者会下载并提取引用的 tarball. -f ctx/Dockerfile参数指定ctx.tar.gz中用于构建映像的Dockerfile的路径. 该Dockerfile中引用本地路径的任何ADD命令都必须相对于ctx.tar.gz中内容的根目录. 在上面的示例中,tarball 包含目录ctx/ ,因此ADD ctx/container.cfg /操作按预期工作.

Build with -

$ docker build - < Dockerfile

这将在没有上下文的情况下从STDIN读取 Dockerfile. 由于缺少上下文,任何本地目录的内容都不会发送到 Docker 守护进程. 由于没有上下文,Dockerfile ADD只有在引用远程 URL 时才有效.

$ docker build - < context.tar.gz

这将为从STDIN读取的压缩上下文构建图像. 支持的格式有:bzip2、gzip 和 xz.

Use a .dockerignore file

$ docker build .

Uploading context 18.829 MB
Uploading context
Step 1/2 : FROM busybox
 ---> 769b9341d937
Step 2/2 : CMD echo Hello world
 ---> Using cache
 ---> 99cc1ad10469
Successfully built 99cc1ad10469
$ echo ".git" > .dockerignore
$ docker build .
Uploading context  6.76 MB
Uploading context
Step 1/2 : FROM busybox
 ---> 769b9341d937
Step 2/2 : CMD echo Hello world
 ---> Using cache
 ---> 99cc1ad10469
Successfully built 99cc1ad10469

此示例显示使用.dockerignore文件从上下文中排除.git目录. 它的效果可以从上传的上下文大小的变化中看出. 构建器参考包含有关创建 .dockerignore 文件的详细信息.

使用BuildKit 后端时,docker docker build会搜索相对于 Dockerfile 名称的.dockerignore文件. 例如,运行docker build -f myapp.Dockerfile . 将首先查找名为myapp.Dockerfile.dockerignore的忽略文件. 如果找不到这样的文件,则使用.dockerignore文件(如果存在). 如果项目包含多个希望忽略不同文件集的 Dockerfile,则使用基于 Dockerfile 的.dockerignore非常有用.

Tag an image (-t)

$ docker build -t vieux/apache:2.0 .

这将像前面的示例一样构建,但它将标记生成的图像. 存储库名称将是vieux/apache并且标签将是2.0 . 阅读有关有效标签的更多信息.

您可以将多个标签应用于图像. 例如,您可以将latest标签应用到新建的映像并添加另一个引用特定版本的标签. 例如,要将图像同时标记为whenry/fedora-jboss:latestwhenry/fedora-jboss:v2.1 ,请使用以下命令:

$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .

Specify a Dockerfile (-f)

$ docker build -f Dockerfile.debug .

这将使用一个名为Dockerfile.debug的文件而不是Dockerfile来生成构建指令.

$ curl example.com/remote/Dockerfile | docker build -f - .

上述命令将使用当前目录作为构建上下文并从标准输入读取 Dockerfile.

$ docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .
$ docker build -f dockerfiles/Dockerfile.prod  -t myapp_prod .

上述命令将构建当前构建上下文(由.指定)两次,一次使用Dockerfile的调试版本,一次使用生产版本.

$ cd /home/me/myapp/some/dir/really/deep
$ docker build -f /home/me/myapp/dockerfiles/debug /home/me/myapp
$ docker build -f ../../../../dockerfiles/debug /home/me/myapp

这两个docker build命令做的事情完全相同. 它们都使用debug文件的内容而不是查找Dockerfile ,并将使用/home/me/myapp作为构建上下文的根. 请注意,无论您在命令行中如何引用它, debug都位于构建上下文的目录结构中.

Note

如果文件或目录在上传的上下文中不存在,则docker build返回no such file or directory错误. 如果没有上下文,或者您指定的文件位于主机系统的其他位置,则可能会发生这种情况. 出于安全原因,上下文仅限于当前目录(及其子目录),并确保在远程 Docker 主机上可重复构建. 这也是ADD ../file不起作用的原因.

Use a custom parent cgroup (--cgroup-parent)

当 docker docker build使用--cgroup-parent选项运行时,构建中使用的容器将使用相应的docker run flag 运行.

Set ulimits in container (--ulimit)

--ulimit选项与 docker docker build一起使用将导致每个构建步骤的容器使用这些--ulimit标志值启动.

Set build-time variables (--build-arg)

您可以在 Dockerfile 中使用ENV指令来定义变量值. 这些值保留在构建的映像中. 然而,坚持往往不是你想要的. 用户希望根据他们构建映像的主机来指定不同的变量.

一个很好的例子是用于拉取中间文件的http_proxy或源版本. ARG指令允许 Dockerfile 作者定义用户可以在构建时使用--build-arg标志设置的值:

$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 --build-arg FTP_PROXY=http://40.50.60.5:4567 .

此标志允许您传递像 Dockerfile 的RUN指令中的常规环境变量一样访问的构建时变量. 此外,这些值不会像ENV值那样保留在中间或最终图像中. 您必须为每个构建参数添加--build-arg .

在构建过程中回显 Dockerfile 中的ARG行时,使用此标志不会改变您看到的输出.

有关使用ARGENV指令的详细信息,请参阅Dockerfile 参考.

您也可以使用不带值的--build-arg标志,在这种情况下,来自本地环境的值将传播到正在构建的 Docker 容器中:

$ export HTTP_PROXY=http://10.20.30.2:1234
$ docker build --build-arg HTTP_PROXY .

这类似于docker run -e的工作方式. 有关更多信息,请参阅docker run文档.

Optional security options (--security-opt)

此标志仅在 Windows 上运行的守护程序上受支持,并且仅支持credentialspec选项. credentialspec必须采用file://spec.txtregistry://keyname格式.

Specify isolation technology for container (--isolation)

此选项在您在 Windows 上运行 Docker 容器的情况下很有用. --isolation=<value>选项设置容器的隔离技术. 在 Linux 上,唯一支持的是使用 Linux 命名空间的default选项. 在 Microsoft Windows 上,您可以指定以下值:

Value Description
default 使用 Docker 守护程序的--exec-opt指定的值. 如果daemon未指定隔离技术,Microsoft Windows 将使用process作为其默认值.
process 仅命名空间隔离.
hyperv Hyper-V 管理程序基于分区的隔离.

指定不带值的--isolation标志与设置--isolation="default"相同.

Add entries to container hosts file (--add-host)

您可以使用一个或多个--add-host标志将其他主机添加到容器的/etc/hosts文件中. 此示例为名为docker的主机添加静态地址:

$ docker build --add-host=docker:10.180.0.1 .

Specifying target build stage (--target)

在构建具有多个构建阶段的--target时,--target 可用于按名称指定中间构建阶段作为生成图像的最终阶段. 目标阶段之后的命令将被跳过.

FROM debian AS build-env
# ...

FROM alpine AS production-env
# ...
$ docker build -t mybuildimage --target build-env .

Custom build outputs

默认情况下,会根据构建结果创建本地容器映像. --output (或-o )标志允许您覆盖此行为,并指定自定义导出器. 例如,自定义导出器允许您将构建工件导出为本地文件系统上的文件而不是 Docker 映像,这对于生成本地二进制文件、代码生成等很有用.

--output的值是定义导出器类型和选项的 CSV 格式的字符串. 目前,支持localtar导出器. local导出器将生成的构建文件写入客户端的目录. tar导出器类似,但将文件作为单个 tarball ( .tar ) 写入.

如果未指定类型,则该值默认为本地导出器的输出目录. 使用连字符 ( - ) 将输出 tarball 写入标准输出 ( STDOUT ).

以下示例使用当前目录 ( . ) 作为构建上下文构建映像,并将文件导出到当前目录中名为out的目录. 如果目录不存在,Docker 会自动创建目录:

$ docker build -o out .

上面的示例使用简写语法,省略了type选项,因此使用了默认 ( local ) 导出器. 下面的示例显示了使用长手 CSV 语法的等价物,同时指定了typedest (目标路径):

$ docker build --output type=local,dest=out .

使用tar类型将文件导出为.tar存档:

$ docker build --output type=tar,dest=out.tar .

下面的示例显示了使用速记语法时的等效项. 在这种情况下,将-指定为目标,它会自动选择tar类型,并将输出 tarball 写入标准输出,然后将其重定向到out.tar文件:

$ docker build -o - . > out.tar

--output选项从目标阶段导出所有文件. 仅导出特定文件的常见模式是进行多阶段构建并使用COPY --from将所需文件复制到新的暂存阶段.

下面的示例Dockerfile使用单独的阶段来收集构建工件以进行导出:

FROM golang AS build-stage
RUN go get -u github.com/LK4D4/vndr

FROM scratch AS export-stage
COPY --from=build-stage /go/bin/vndr /

When building the Dockerfile with the -o option, only the files from the final stage are exported to the out directory, in this case, the vndr binary:

$ docker build -o out .

[+] Building 2.3s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                          0.1s
 => => transferring dockerfile: 176B                                                                                          0.0s
 => [internal] load .dockerignore                                                                                             0.0s
 => => transferring context: 2B                                                                                               0.0s
 => [internal] load metadata for docker.io/library/golang:latest                                                              1.6s
 => [build-stage 1/2] FROM docker.io/library/golang@sha256:2df96417dca0561bf1027742dcc5b446a18957cd28eba6aa79269f23f1846d3f   0.0s
 => => resolve docker.io/library/golang@sha256:2df96417dca0561bf1027742dcc5b446a18957cd28eba6aa79269f23f1846d3f               0.0s
 => CACHED [build-stage 2/2] RUN go get -u github.com/LK4D4/vndr                                                              0.0s
 => [export-stage 1/1] COPY --from=build-stage /go/bin/vndr /                                                                 0.2s
 => exporting to client                                                                                                       0.4s
 => => copying files 10.30MB                                                                                                  0.3s

$ ls ./out
vndr

Note

此功能需要 BuildKit 后端. 您可以启用 BuildKit或使用提供更多输出类型选项的buildx插件.

Specifying external cache sources

除了本地构建缓存之外,构建器还可以重用从先前构建生成的缓存,其中--cache-from标志指向注册表中的图像.

要将图像用作缓存源,需要在创建时将缓存元数据写入图像. 这可以通过在构建映像时设置--build-arg BUILDKIT_INLINE_CACHE=1来完成. 之后,构建的镜像可以用作后续构建的缓存源.

导入缓存后,构建器只会从注册表中提取 JSON 元数据,并根据该信息确定可能的缓存命中. 如果缓存命中,匹配的图层将被拉入本地环境.

除了图像之外,还可以从buildx或 BuildKit CLI ( buildctl ) 生成的特殊缓存清单中提取缓存. 这些清单(使用type=registrymode=max选项构建时)允许为多阶段构建中的中间阶段提取层数据.

以下示例使用 inline-cache 元数据构建映像并将其推送到注册表,然后将该映像用作另一台计算机上的缓存源:

$ docker build -t myname/myapp --build-arg BUILDKIT_INLINE_CACHE=1 .
$ docker push myname/myapp

推送完镜像后,该镜像在另一台机器上作为缓存源使用. 如果需要,BuildKit 会自动从注册表中提取图像.

在另一台机器上:

$ docker build --cache-from myname/myapp .

Note

此功能需要 BuildKit 后端. 您可以启用 BuildKit或使用buildx插件. 以前的构建器对从预拉图像重用缓存的支持有限.

Squash an image’s layers (--squash) (experimental)

Overview

构建图像后,将新图层压缩为具有单个新图层的新图像. 挤压不会破坏任何现有图像,而是使用挤压层的内容创建一个新图像. 这有效地使它看起来像所有Dockerfile命令都是用单层创建的. 使用此方法保留构建缓存.

--squash选项是一个实验性功能,不应该被认为是稳定的.

如果 Dockerfile 生成多个层来修改相同的文件(例如,在一个步骤中创建并在另一步骤中删除的文件),压缩层可能会很有用. 对于其他用例,压缩图像实际上可能会对性能产生负面影响; 拉取包含多个图层的图像时,可以并行拉取图层,并允许图像之间共享图层(节省空间).

对于大多数用例,多阶段构建是更好的选择,因为它们可以对构建进行更细粒度的控制,并且可以利用构建器中未来的优化. 有关更多信息,请参阅用户指南中的使用多阶段构建部分.

Known limitations

--squash选项有许多已知的限制:

  • 压缩层时,生成的图像无法利用与其他图像共享层的优势,并且可能会使用更多空间. 仍然支持共享基础映像.
  • 使用此选项时,由于存储了两个映像副本,您可能会看到使用的空间显着增加,一个用于构建缓存,所有缓存层都完好无损,另一个用于压缩版本.
  • 虽然压缩层可能会产生更小的图像,但它可能会对性能产生负面影响,因为提取单个层需要更长的时间,并且无法并行下载单个层.
  • 当尝试压缩未更改文件系统的映像时(例如,Dockerfile 仅包含ENV指令),压缩步骤将失败(请参阅问题 #33823 ).

Prerequisites

此页面上的示例在 Docker 19.03 中使用实验模式.

实验模式可以通过在启动 Docker 守护进程时使用--experimental标志或在daemon.json配置文件中设置experimental: true来启用.

默认情况下,实验模式被禁用. 要查看 docker 守护程序的当前配置,请使用docker version命令并检查Engine部分中的Experimental行:

Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 [...]

要启用实验模式,用户需要在启用实验标志的情况下重新启动 docker 守护进程.

Enable Docker experimental

要启用实验性功能,您需要使用--experimental标志启动 Docker 守护程序. 您还可以通过/etc/docker/daemon.json启用守护程序标志,例如:

{
    "experimental": true
}

然后确保启用了实验标志:

$ docker version -f '{{.Server.Experimental}}'
true

Build an image with --squash argument

以下是带有--squash参数的 docker build 示例

FROM busybox
RUN echo hello > /hello
RUN echo world >> /hello
RUN touch remove_me /remove_me
ENV HELLO=world
RUN rm /remove_me

名为test的图像是使用--squash参数构建的.

$ docker build --squash -t test .

<...>

如果一切正常,历史将如下所示:

$ docker history test

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4e10cb5b4cac        3 seconds ago                                                       12 B                merge sha256:88a7b0112a41826885df0e7072698006ee8f621c6ab99fca7fe9151d7b599702 to sha256:47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb
<missing>           5 minutes ago       /bin/sh -c rm /remove_me                        0 B
<missing>           5 minutes ago       /bin/sh -c #(nop) ENV HELLO=world               0 B
<missing>           5 minutes ago       /bin/sh -c touch remove_me /remove_me           0 B
<missing>           5 minutes ago       /bin/sh -c echo world >> /hello                 0 B
<missing>           6 minutes ago       /bin/sh -c echo hello > /hello                  0 B
<missing>           7 weeks ago         /bin/sh -c #(nop) CMD ["sh"]                    0 B
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:47ca6e777c36a4cfff   1.113 MB

我们可以发现一个图层的名称是<missing> ,并且有一个带有 COMMENT merge的新图层.

测试图像,检查/remove_me是否消失,确保hello\nworld/hello中,确保HELLO环境变量的值为world .

by  icopy.site