【问题标题】:how to run multiple npm scripts in docker CMD command如何在 docker CMD 命令中运行多个 npm 脚本
【发布时间】:2020-06-29 08:41:47
【问题描述】:

我为 nodejs 项目创建了一个 Dockerfile。它包含一个带有许多脚本的 package.json。

"scripts": {
        "start": "npm run",
        "server": "cd server && npm start",
        "generator": "cd generator && npm start",
...
    },

我需要在我的 docker 镜像中运行 servergenberator。如何做到这一点?

我试过了:

CMD ls;npm run server ; npm run generator 这将找不到包 json,因为 shellform 似乎在 /bin/sh -c 中运行。

CMD ["npm","run","server"] 也不起作用,并且缺少第二条命令

第一次尝试的 ls 显示所有文件都已就位(包括 package.json)。

为了完整起见,有问题的项目是https://github.com/seekwhencer/node-bilder-brause(不是我的)。 当前的 Dockerfile:

FROM node:14

# Create app directory
WORKDIR /usr/src/app

# Bundle app source
COPY ./* ./

RUN npm install

EXPOSE 3050
EXPOSE 3055
CMD ls ; npm run server ; npm run generator

【问题讨论】:

  • 编写一个包含npm 命令的包装脚本,然后将其用作您的CMD
  • 你能回答这个问题吗?

标签: node.js docker npm


【解决方案1】:

CMDENTRYPOINT 中运行多个命令的典型方法是将所有命令写入一个文件,然后运行该文件。这在下面的 Dockerfile 中得到了演示。

此 Dockerfile 还安装 imagemagick,这是 OP 尝试使用的包的依赖项。我还将基础映像更改为 node:14-alpine,因为它比 node:14 小得多,但同样适用于此目的。

FROM node:14-alpine

# Install system dependencies for this package.
RUN apk add --no-cache imagemagick

# Create app directory
WORKDIR /usr/src/app

# Bundle app source
COPY . .

RUN npm install \
    # Install server and generator.
    && npm run postinstall \
    # Write entrypoint.
    && printf "ls\nnpm run server\nnpm run generator\n" > entrypoint.sh

EXPOSE 3050
EXPOSE 3055

CMD ["/bin/sh", "entrypoint.sh"]
docker build --tag nodebilderbrause .
docker run --rm -it nodebilderbrause

entrypoint.sh 的内容写入 Dockerfile。这是文件的样子。

ls
npm run server
npm run generator

【讨论】:

  • 能否请您添加 sh 文件?如果它有超过 2 行 1: npm run server 2:npm run generator
  • 我不明白你在问什么。你想要shell文件的内容吗?
  • jakub 对不起 - 但是是的。 (无论如何我都接受并投了赞成票)
【解决方案2】:

我找到了另一种方式,为了完整起见并为我提供参考: https://www.npmjs.com/package/concurrently

添加

RUN npm install -g concurrently

启用:

CMD ["concurrently","npm:server", "npm:generator"]

【讨论】:

    【解决方案3】:

    如果您需要运行两个独立的进程,典型的方法是运行两个独立的容器。你可以在同一个镜像上运行两个容器;启动容器时覆盖容器的命令部分非常简单。

    您需要选择一些作为默认的CMD。例如,鉴于您显示的package.json,您可以指定

    CMD npm start
    

    当你真正去运行容器时,你可以指定一个备用命令:图像名称之后的任何东西都被当作命令。 (如果您使用 Docker Compose,请指定 command:。)典型的 docker run 设置可能如下所示:

    docker build -t bilder-brause .
    
    docker network create photos
    
    docker run \
      --name server \
      --net photos \
      -d \
      -p 3050:3050 \
      bilder-brause \
      npm run server
    
    docker run \
      --name generator \
      --net photos \
      -d \
      -p 3055:3055 \
      bilder-brause \
      npm run generator
    

    如果您真的需要,您可以使用单独的 EXPOSECMD 指令为不同的组件构建单独的图像

    FROM bilder-brause
    EXPOSE 3050
    CMD npm run server
    

    构建这些只是小麻烦;无法在 Compose 中指定构建一个本地图像 FROM 另一个,因此排序可能不正确,例如。

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2017-08-16
      • 2019-11-30
      • 2021-07-22
      • 2021-03-13
      • 2021-09-13
      • 2010-09-16
      • 2020-05-10
      • 2019-06-11
      相关资源
      最近更新 更多