Remove blank lines after code block markers

This commit is contained in:
yeasy
2026-03-21 22:36:09 -07:00
parent 312f8fea42
commit 9ac19d79ee
132 changed files with 0 additions and 1517 deletions

View File

@@ -11,7 +11,6 @@ Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Doc
```bash
$ docker init
```
该命令会交互式地询问项目类型 ( GoNode.jsPythonRust )并生成符合最佳实践的配置文件对于新项目这是推荐的起步方式
### 4.5.2 手动创建 Dockerfile
@@ -25,14 +24,12 @@ $ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
```
其内容为
```docker
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
这个 Dockerfile 很简单一共就两行涉及到了两条指令`FROM` `RUN`
### 4.5.3 FROM 指定基础镜像
@@ -49,7 +46,6 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM scratch
...
```
如果你以 `scratch` 为基础镜像的话意味着你不以任何镜像为基础接下来所写的指令将作为镜像第一层开始存在
不以任何系统为基础直接将可执行文件复制进镜像的做法并不罕见对于 Linux 下静态编译的程序来说并不需要有操作系统提供运行时支持所需的一切库都已经在可执行文件里了因此直接 `FROM scratch` 会让镜像体积更加小巧使用 [Go 语言](https://golang.google.cn/)开发的应用很多会使用这种方式来制作镜像,这也是有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
@@ -63,7 +59,6 @@ FROM scratch
```docker
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
```
* *exec* 格式`RUN [“可执行文件”, “参数1”, “参数2”]`这更像是函数调用中的格式
Dockerfile 中每一个指令都会建立一层`RUN` 也不例外每一个 `RUN` 的行为就和刚才我们手工建立镜像的过程一样新建立一层在其上执行这些命令执行结束后`commit` 这一层的修改构成新的镜像
@@ -93,7 +88,6 @@ Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
```
从命令的输出结果中我们可以清晰的看到镜像的构建过程 `Step 2` 如同我们之前所说的那样`RUN` 指令启动了一个容器 `9cdc27646c7b`执行了所要求的命令并最后提交了这一层 `44aa4490ce2c`随后删除了所用到的这个容器 `9cdc27646c7b`
这里我们使用了 `docker build` 命令进行镜像构建其格式为
@@ -101,7 +95,6 @@ Successfully built 44aa4490ce2c
```bash
docker build [选项] <上下文路径/URL/->
```
在这里我们指定了最终镜像的名称 `-t nginx:v3`构建成功后我们可以像之前运行 `nginx:v2` 那样来运行这个镜像其结果会和 `nginx:v2` 一样
### 4.5.6 镜像构建上下文
@@ -119,7 +112,6 @@ docker build [选项] <上下文路径/URL/->
```docker
COPY ./package.json /app/
```
这并不是要复制执行 `docker build` 命令所在的目录下的 `package.json`也不是复制 `Dockerfile` 所在目录下的 `package.json`而是复制 **上下文 (context)** 目录下的 `package.json`
因此`COPY` 这类指令中的源文件的路径都是*相对路径*这也是初学者经常会问的为什么 `COPY ../package.json /app` 或者 `COPY /opt/xxxx /app` 无法工作的原因因为这些路径已经超出了上下文的范围Docker 引擎无法获得这些位置的文件如果真的需要那些文件应该将它们复制到上下文目录中去
@@ -133,7 +125,6 @@ $ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
...
```
理解构建上下文对于镜像构建是很重要的避免犯一些不应该的错误比如有些初学者在发现 `COPY /opt/xxxx /app` 不工作后于是干脆将 `Dockerfile` 放到了硬盘根目录去构建结果发现 `docker build` 执行后在发送一个几十 GB 的东西极为缓慢而且很容易构建失败那是因为这种做法是在让 `docker build` 打包整个硬盘这显然是使用错误
一般来说应该会将 `Dockerfile` 置于一个空目录下或者项目根目录下如果该目录下没有所需文件那么应该把所需文件复制一份过来如果目录下有些东西确实不希望构建时传给 Docker 引擎那么可以用 `.gitignore` 一样的语法写一个 `.dockerignore`该文件是用于剔除不需要作为上下文传递给 Docker 引擎的
@@ -151,7 +142,6 @@ Sending build context to Docker daemon 2.048 kB
或许你已经注意到了`docker build` 还支持从 URL 构建比如可以直接从 Git repo 中构建
```bash
## $env:DOCKER_BUILDKIT=0
## export DOCKER_BUILDKIT=0
@@ -168,7 +158,6 @@ Removing intermediate container d2a513a760ed
---> 038ad4142d2b
Successfully built 038ad4142d2b
```
这行命令指定了构建所需的 Git repo并且指定分支为 `master`构建目录为 `/amd64/hello-world/`然后 Docker 就会自己去 `git clone` 这个项目切换到指定分支并进入到指定目录后开始构建
#### 用给定的 tar 压缩包构建
@@ -176,7 +165,6 @@ Successfully built 038ad4142d2b
```bash
$ docker build http://server/context.tar.gz
```
如果所给出的 URL 不是个 Git repo而是个 `tar` 压缩包那么 Docker 引擎会下载这个包并自动解压缩以其作为上下文开始构建
#### 从标准输入中读取 Dockerfile 进行构建
@@ -184,13 +172,11 @@ $ docker build http://server/context.tar.gz
```bash
docker build - < Dockerfile
```
```bash
cat Dockerfile | docker build -
```
如果标准输入传入的是文本文件则将其视为 `Dockerfile`并开始构建这种形式由于直接从标准输入中读取 Dockerfile 的内容它没有上下文因此不可以像其他方法那样可以将本地文件 `COPY` 进镜像之类的事情
#### 从标准输入中读取上下文压缩包进行构建
@@ -198,5 +184,4 @@ cat Dockerfile | docker build -
```bash
$ docker build - < context.tar.gz
```
如果发现标准输入的文件格式是 `gzip``bzip2` 以及 `xz` 的话将会使其为上下文压缩包直接将其展开将里面视为上下文并开始构建