首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用复制和绑定挂载

如何正确使用复制和绑定挂载
EN

Stack Overflow用户
提问于 2022-07-25 10:28:57
回答 1查看 59关注 0票数 0

当我开发示例应用程序并读取停靠程序文档时,我注意到COPY命令和bind-mount之间的区别是什么,我们的设置如下所示。我知道COPY将在初始构建时将本地文件复制到容器,time.and bind-mount将本地目录同步到容器目录。

这似乎是相同的功能。所以我想知道如何正确地使用它们。如果有人有意见,请告诉我。谢谢

docker-compose

代码语言:javascript
复制
version: "3"
services:
  form-api:
    container_name: "api"
    env_file: .env.development
    build:
      context: .
      dockerfile: ./packagesapi/Dockerfile
    tty: true
    ports:
      - 3303:3303
    depends_on:
      - dynamodb-local
      - database
    volumes:
      - ./packages/form-api/:/app/packages/form-api/
      - ./packages/infrastructure/:/app/packages/infrastructure/
      - ./packages/library/:/app/packages/library/

dockerfile

代码语言:javascript
复制
FROM node:16.10-buster
ENV LANG C.UTF-8
ENV TZ 'Asia/Tokyo'
ENV DEBCONF_NOWARNINGS=yes

# Create app directory
WORKDIR /app

RUN apt-get update && apt-get install -y postgresql-client
RUN npm install -g npm@7.18.1 serverless serverless-offline

# root
COPY .npmrc ./
COPY ./package*.json ./
COPY ./tsconfig.json ./
COPY ./tsconfig.build.json ./

COPY ./packages/library ./packages/library
COPY ./packages/infrastructure/ ./packages/infrastructure/
COPY ./packages/form-api/ ./packages/form-api/

RUN npm install
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-25 10:50:32

您应该从您的volumes:文件中删除docker-compose.yml,并确保将应用程序代码放入映像中。另外,不要忘记在Dockerfile中设置一个CMD

Docker的核心概念之一是,图像是应用程序的不可变、独立的副本。就像您不下载Firefox,然后单独下载它的源代码一样,图像应该可以自己运行。理想就是能跑

代码语言:javascript
复制
docker run --name api -d -p 3000:3000 your-image

虽然这并不总是可能的,但通常情况下,如果在Dockerfile或运行时选项中指定内容是合理的,则最好将它们放在Dockerfile中。

另一个考虑因素是像Kubernetes这样的集群环境。在那里,几乎不可能将源代码上传到卷中,但使用Docker映像是非常简单的。

我还看到一些问题出现在Dockerfile中,这些工作是由绑定挂载隐藏的。这可能和丢失的RUN chmod +x一样少,或者偶尔图像会重新排列文件。如果要用绑定挂载覆盖图像内容,则没有运行实际映像,也没有测试没有挂载的标准设置。

尤其是对于Node应用程序,“模式”似乎是用绑定挂载覆盖整个图像内容。但是,如果您正在这样做,那么您的自定义映像中没有任何内容,您还不如使用绑定挂载运行一个node映像。但是,如果您这样做,那么您将更多地处理Docker的文件系统隔离问题,而不是从中获益;您最好直接在您的主机上运行Node,而不必为这个设置操心。

COPY的缺点是,您需要在应用程序代码更改时重建映像,即使您的应用程序不需要构建步骤。这也是本地环境可以派上用场的地方: Docker有时会干扰实时重新加载的设置,但是它们在实际的本地环境中会很好地工作,所以您可以在本地构建、开发和测试应用程序,并且一旦它工作成功,就将它带到Docker中进行集成测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73107728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档