为什么我们在 Docker 的最终“CMD”命令期间安装依赖项,在开发中?

哈里森克莱默

我正在阅读一本关于引导微服务的书,作者提供了以下 dockerfile,旨在用于开发。**

FROM node:12.18.1-alpine
WORKDIR /usr/src/app
COPY package*.json .
CMD npm config set cache-min 999999 && \
   npm install && \
   npm run start:dev

CMD这里命令显然有些不同寻常。提供的基本原理如下:通过npm install在容器启动时执行,我们可以“利用 npm 缓存,因此在容器启动时安装比在构建过程中安装要快得多”。

这个CMD命令在幕后发生了什么?这与在RUN命令之前安装依赖项的CMD命令有什么不同?与此相关的是,为什么我们需要制定cache-min政策?

**源文件未复制到此处,因为它们包含在已安装的卷中。

编辑:这里也是 docker compose 文件

version: '3'
services:
  history:
    image: history
    build:
      context: ./history
      dockerfile: Dockerfile-dev
    container_name: history
    volumes:
      - /tmp/history/npm-cache:/root/.npm:z
      - ./history/src:/usr/src/app/src/:z
    ports:
      - '4002:80'
    environment:
      - PORT=80
      - NODE_ENV=development
    restart: 'no'

    ...
汉斯·基利安

在开发时,您经常会更改项目中包含的包。通过这种方式,您无需在执行此操作时构建新映像。您只需停止并启动容器,它就会安装新的软件包。

不过,我对 package*.json 的复制感到有些惊讶。我假设这将使用像您所说的源代码那样的卷传递到图像中。它仍然可以这样做,也许确实如此。我们需要看看你的docker run命令是否知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们在 Docker Compose 中增加版本?(版本 1、2 和 3)

为什么我们要在 docker 中同时使用 --detach 开关与 --interactive 和 --tty ?

为什么“无”映像出现在Docker中以及我们如何避免它

我们为什么要使用docker-registry?

在Docker中,apt-get安装失败,并显示“无法获取http://archive.ubuntu.com/ ...找不到404”错误。为什么?我们该如何克服?

在OCaml中,我们为什么有'+。','-。' 但是我们仅使用“ <”而不是“ <。”?

为什么我们需要开发分支?

为什么我们同时“包含”和“依赖” RcppArmadillo?

为什么我们必须为ReactJS安装NodeJS

为什么我们投可比在TreeMap中

为什么我们到底需要Java中的StringBuffer

为什么我们需要Java中的默认方法?

为什么我们需要纯<?>在Java中?

为什么我们使用 try,除了在 Python 中

为什么我们在MongoDB中需要created_at

为什么我们需要python中的协程?

为什么我们需要Java中的Properties类?

为什么我们需要Kubernetes中的服务帐户?

我们为什么要在pytorch中“打包”序列?

为什么我们在芹菜中需要签名?

为什么我们在git中需要SSH密钥?

为什么我们在Tensorflow中命名变量?

为什么我们需要C ++中的虚函数?

为什么我们需要Clojure中的'in(require'[...]])?

为什么我们需要Java中的弱引用

为什么我们在Python中需要“ finally”子句?

为什么我们在Hadoop堆栈中需要ZooKeeper?

为什么我们在Typescript中需要任何类型?

为什么我们在指令中“要求” ngModel与注入?