[英]how to run multiple npm scripts in docker CMD command
我为 nodejs 项目创建了一个 Dockerfile。 它包含一个带有许多脚本的 package.json。
"scripts": {
"start": "npm run",
"server": "cd server && npm start",
"generator": "cd generator && npm start",
...
},
我需要在我的genberator
映像中运行server
和发电机。 如何做到这一点?
我试过了:
CMD ls;npm run server; npm run generator
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
在CMD
或ENTRYPOINT
中运行多个命令的典型方法是将所有命令写入文件,然后运行该文件。 这在下面的 Dockerfile 中得到了证明。
这个 Dockerfile 还安装了 imagemagick,这是 package 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
我找到了另一种方法,为了完整起见并为我添加参考: https://www.npmjs.com/package/concurrently
添加
RUN npm install -g concurrently
启用:
CMD ["concurrently","npm:server", "npm:generator"]
如果需要运行两个独立的进程,典型的做法是运行两个独立的容器。 你可以在同一个镜像上运行两个容器; 启动容器时覆盖容器的命令部分非常简单。
您需要选择一些作为默认的CMD
。 例如,鉴于您显示的package.json
,您可以指定
CMD npm start
当您实际 go 运行容器时,您可以指定备用命令:将图像名称后的任何内容作为命令。 (如果您使用 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
如果您真的想要,您可以使用单独的EXPOSE
和CMD
指令为不同的组件构建单独的图像
FROM bilder-brause
EXPOSE 3050
CMD npm run server
构建这些是一个小麻烦; 例如,无法在 Compose 中指定一个本地图像是FROM
另一个图像构建的,因此排序可能不会正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.