将目录从主机复制到 Docker 镜像
Docker 文档将 Docker 定义为独立于基础架构的工具,可帮助开发人员以最快的方式开发、发布和运行应用程序。
除了这些好处之外,DevOps 开发人员还在持续集成、交付和部署中使用 Docker。 这种开发方法通常称为 CI/CD,开发人员使用容器来开发、测试并将更改或功能部署到生产中。
应用程序中的错误在开发环境中得到修复。 完成后,将在测试环境中执行自动化测试。 最后,当所有测试都通过后,具有新更改的图像将部署到生产环境中。
本教程将教我们如何将目录从主机复制到 docker 镜像。 我们将使用一个返回 API 的快速应用程序来实现这一点。
创建一个快速应用程序
打开 Intellij IDEA。 选择文件 -> 新建 -> 项目。 在打开的窗口中,选择左侧的 Node.js 并将项目名称从 untitled 更改为 employee-api。 最后,点击创建按钮生成一个项目。
要在我们的应用程序中安装 Express,请通过选择 View > Tool Windows > Terminal 在 Intellij IDEA 上打开一个新的终端窗口,然后使用以下命令安装 Express。
~/WebstormProjects/employee-api$ npm install express
安装 express 后,在文件夹 employee-api 中创建一个名为 main-app 的文件夹。 然后,要创建我们的 API,请在文件夹 main-app 中创建一个名为 index.js 的文件,并将以下代码栏复制并粘贴到该文件中。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.json(
[{
name: 'Bob',
email: "bob@gmail.com"
},
{
name: 'Alice',
email: 'alice@gmail.com'
},
])
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
在这个文件中,我们创建了一个暴露端口 3000 的 express 应用程序,任何对路径 / 的请求都会返回一个员工数组。 我们将在以下部分中介绍的所有示例中使用此应用程序。
使用 ADD 指令
在我们的基本文件夹 employee-api 中创建一个名为 Dockerfile 的文件,并将以下代码复制并粘贴到该文件中。
FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD main-app /com/employee/main-app
CMD node main-app/index.js
要创建应用程序的自定义映像,我们通常使用名为 Dockerfile 的文件,如本例所示。 以下部分定义了文件中使用的每个命令的含义。 我们关心的是倒数第二行的 ADD 命令。
前面代码示例中使用的所有命令简要说明如下:
- FROM - 在 Dockerfile 中声明的第一个命令,其主要目的是声明我们将用于构建镜像的基础镜像。 请注意,基本图像是从公共存储库中提取的。
- WORKDIR - 设置工作目录,即使我们在其他指令中没有设置,也会创建工作目录。
- ADD - 将文件或文件夹从源复制到目标。 源通常是主机,目标是容器的文件系统。
- RUN - 在现有图像之上执行提供的命令并返回包含执行结果的新图像。 在这种情况下,该命令会在当前映像上安装依赖项。 并且生成的图像配备了依赖项。
- CMD - 当我们启动一个容器时,该指令提供容器的默认值,包括可执行文件或入口点指令。 在本例中,我们使用了指令的 shell 形式。 此外,我们提供了一个可执行文件作为我们容器的默认值。
请注意
,我们已使用 ADD 指令将 main-app 目录从我们的主机复制到在我们的工作目录 /com/employee/main-app 中创建的新目录。 要查看实际效果,请使用以下命令创建一个带有标签 employee-api 的图像。
~/WebstormProjects/employee-api$ docker build --tag employee-api:latest.
观察控制台上的前五个指令,直到构建成功。 然后,确保您可以看到正在执行的指令,如下所示。
=> [1/5] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6997b 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 137B 0.0s
=> CACHED [2/5] WORKDIR /com/employee 0.0s
=> CACHED [3/5] ADD package*.json ./ 0.0s
=> CACHED [4/5] RUN npm install 0.0s
=> CACHED [5/5] ADD main-app /com/employee/main-app
当我们从我们的图像运行一个容器时,最后一条指令被执行。 例如,使用以下命令从我们的镜像运行一个容器。
~/WebstormProjects/employee-api$ docker run --name employee-service -d -p 3000:3000 employee-api:latest
此命令在分离模式下使用我们的图像 employee-api 运行名为 employee-service 的容器 -d 并将端口 -p 3000 映射到本地主机上的端口 3000。
要验证我们的应用程序是否按预期工作,请转到 localhost:3000 http://localhost:3000/
以获取员工数据。 以下是请求返回的 JSON 数组。
[
{
"name": "Bob",
"email": "bob@gmail.com"
},
{
"name": "Alice",
"email": "alice@gmail.com"
}
]
使用 COPY 指令
对名为Dockerfile的文件中的说明进行注释,将以下代码复制粘贴到注释后的文件中。
FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
COPY main-app /com/employee/main-app
CMD node main-app/index.js
请注意
,这些说明与前面示例中的说明相同。 我们所做的唯一更改是将倒数第二行中的 ADD 指令替换为 COPY 指令。
COPY - 将文件或文件夹从源复制到目标。 源通常是主机,目标是容器的文件系统。
请注意
,COPY 指令类似于 ADD 指令,因为它们实现了相同的目标。 要查看实际效果,请使用我们在上一个示例中使用的命令来创建映像并从映像运行容器。
我们可以创建新图像或重新创建现有图像。 要重新创建现有镜像,我们需要停止正在运行的容器,移除容器,然后移除镜像。 使用以下命令分别执行步骤。
~/WebstormProjects/employee-api$ docker stop employee-service
~/WebstormProjects/employee-api$ docker rm -f employee-service
~/WebstormProjects/employee-api$ docker rmi -f employee-api:latest
使用 ADD 指令的替代方法
对名为Dockerfile的文件中的说明进行注释,将以下代码复制粘贴到注释后的文件中。
FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD . .
CMD node main-app/index.js
请注意
,此示例与前面的示例类似,我们所做的唯一更改是将 COPY 指令替换为 ADD 指令。 本例中的 ADD 指令使用两个点。 . 指定源和目标。
表示我们要将当前目录下的所有内容复制到工作目录下。 因此,例如,使用此命令,我们可以将 main-app 文件夹及其内容添加到映像中的工作目录 /com/employee,这比其他示例容易得多。
我们可以使用 .dockerignore 文件来添加我们不想添加到镜像中的文件和文件夹。 然后,使用我们在前面示例中使用的命令来构建映像并从映像运行容器。
输出仍然相同,因为我们没有更改 express 应用程序中的任何代码。
所以,我们已经学习了如何将目录从主机复制到我们图像的文件系统。 我们还可以使用 ADD 和 COPY 指令将一个目录复制到另一个目录。
我们还可以使用带有两个点 COPY 的 COPY 指令。 .
它仍然会产生同样的效果。
相关文章
在 Linux 中托管 Docker Internal
发布时间:2023/04/18 浏览次数:139 分类:Docker
-
Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。
在 Docker 中设置工作目录
发布时间:2023/04/18 浏览次数:82 分类:Docker
-
在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。
在 Docker 容器中公开多个端口
发布时间:2023/04/18 浏览次数:143 分类:Docker
-
Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。
将用户添加到 Docker 容器
发布时间:2023/04/18 浏览次数:187 分类:Docker
-
在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。
使用 Docker 网络主机命令
发布时间:2023/04/18 浏览次数:112 分类:Docker
-
在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。
清除 Docker 容器日志
发布时间:2023/04/18 浏览次数:181 分类:Docker
-
本文介绍了我们可以用来清除 docker 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。
Dockerfile 中 COPY 和 ADD 命令的区别
发布时间:2023/04/18 浏览次数:158 分类:Docker
-
在 Dockerfile 中,我们可以使用 COPY 或 ADD 命令复制这些文件。 这些命令在功能上是相同的; 但是,存在一些差异。本文介绍了 Dockerfile 中 COPY 和 ADD 命令之间的区别。