Docker提供了两个很好的选择来将代码移动到映像或容器中: 绑定安装Dockerfile COPY 指令 。 在本文中,我将解释为什么映像在生产中应始终使用COPY指令,以及为什么在开发中使用绑定安装会更方便。

Dockerfile COPY指令

Dockerfile中的COPY指令用于将文件或目录从主机文件系统复制到映像中。 例如,以下Dockerfile设置一个NodeJS应用程序以在生产模式下运行。

# Dockerfile
FROM node:carbon
WORKDIR /app
ENV NODE_ENV=production
# Install dependencies first to take advantage of Docker layer caching. 
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile --no-cache --production
# Copy the application files into the image. 
COPY . .
EXPOSE 3000
CMD [ "node", "app.js" ]

构建并运行:

$ docker build -t myapp .
$ docker run -d -p 3000:3000 myapp

COPY指令以递归方式将文件和目录从主机复制到映像中,这意味着还可以复制敏感文件。类似于Git的.gitignore ,Docker的.dockerignore 文件使您可以防止某些文件复制到映像中。 使用 COPY 指令 时,始终包含 .dockerignore 文件 。 至少,它应包括与版本控制系统和本地安装的依赖项有关的文件。 例如,典型的NodeJS应用程序可能使用以下内容。

# .dockerignore
.git
Dockerfile
.dockerignore
node_modules
npm-debug.log

绑定坐骑

绑定安装允许您将文件或目录从主机安装到容器中。 在以下代码段中,工作目录已安装,并且可以从容器中的/app访问。 容器运行后,您可以通过外壳与其进行交互。

$ docker run --rm -it -p 3000:3000 -v $(pwd):/app myapp bash
root@id:/app# yarn global add nodemon
root@id:/app# nodemon app.js

nodemon是一种nodemon文件更改并在检测到更改时自动重新启动应用程序的工具。 在上面的示例中,当您在主机上更改文件时,这些更改将通过绑定安装自动显示在容器中,并且您的应用将通过nodemon自动重新启动。

COPY指令和绑定支架之间选择

什么时候应该使用COPY指令,什么时候应该使用绑定安装?

绑定坐骑非常适合当地发展 。 它们通过以下事实提供了便利:对主机的开发环境和代码的更改会立即反映在容器中,并且应用程序在容器中创建的文件(例如构建工件或日志文件)可以从主机获得。

但是,绑定安装确实会带来一些安全问题。 从Docker存储文档中

使用绑定挂载的好与坏的一个副作用是,您可以通过容器中运行的进程来更改主机文件系统,包括创建,修改或删除重要的系统文件或目录。 这是一项强大的功能,可能会带来安全隐患,包括影响主机系统上的非Docker进程。
[…]
如果您以这种方式使用Docker进行开发,那么您的生产Dockerfile会将生产就绪的工件直接复制到映像中,而不是依赖于绑定安装。

绑定安装将主机系统暴露给容器,并降低了容器的安全性和隔离性。 即使是只读绑定安装,也可以公开.dockerignore将从映像中排除的文件。 为了避免在生产中出现这些问题 应使用 COPY 命令将代码传输到映像中,而不是将绑定装入。

进一步阅读

Docker文档提供了有关其他挂载类型的详细信息,并提供了有关其可能用例的更多详细信息。 特别是,在某些使用情况下,将绑定安装用于配置文件可能会很有利。

实际上, 不要忽略 .dockerignore

From: https://hackernoon.com/how-to-move-code-into-a-docker-container-ab28edcc2901

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐