如何在Docker的CMD命令中运行多个npm脚本

3
我为一个nodejs项目创建了一个Dockerfile。它包含一个带有许多脚本的package.json。
"scripts": {
        "start": "npm run",
        "server": "cd server && npm start",
        "generator": "cd generator && npm start",
...
    },

我需要在我的Docker镜像中运行 servergenerator,如何实现?
我尝试过:
CMD ls;npm run server ; npm run generator ,这不会找到package 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

1
编写一个包装脚本,其中包含npm命令,并将其用作你的CMD - undefined
你能把这个变成一个答案吗? - undefined
3个回答

12

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 - undefined
我不明白你在问什么。你是想要shell文件的内容吗? - undefined
Jakub,很抱歉,但是是的。(我还是接受并点赞了) - undefined
我们可以在entrypoint.sh中使用命令npm run server & npm run generator吗? - undefined

9

我发现另一种方法,完整性和参考我的原因是:

https://www.npmjs.com/package/concurrently

添加:

RUN npm install -g concurrently

可以启用:

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


对我来说有效。谢谢! - undefined

1
如果需要运行两个独立的进程,通常的做法是运行两个独立的容器。您可以使用同一镜像运行两个容器;在启动容器时覆盖容器的命令部分非常简单。
您需要选择一个默认的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,因此顺序可能不正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接