Docker CMD不';无法识别pm2运行时

Docker CMD不';无法识别pm2运行时,docker,nginx,pm2,nuxt.js,Docker,Nginx,Pm2,Nuxt.js,我试图构建一个结合了nginx和pm2的docker映像,但当我试图像这样执行pm2时,我得到以下错误: /bin/sh: [pm2-runtime,: not found 奇怪的是,如果我重写CMD并像这样使用它: sudo docker run -it -p 80:80 frontend-test pm2-runtime 它确实识别安装了pm2(-runtime)。有人知道这种黑魔法是怎么发生的吗?在以前的版本中,我生成nuxt页面,并通过Nginx静态地为它们提供服务,但现在我想将其转

我试图构建一个结合了nginx和pm2的docker映像,但当我试图像这样执行pm2时,我得到以下错误:

/bin/sh: [pm2-runtime,: not found
奇怪的是,如果我重写CMD并像这样使用它:

sudo docker run -it -p 80:80 frontend-test pm2-runtime
它确实识别安装了pm2(-runtime)。有人知道这种黑魔法是怎么发生的吗?在以前的版本中,我生成nuxt页面,并通过Nginx静态地为它们提供服务,但现在我想将其转换为使用nuxt的SSR模式。我的目标是运行应用程序,然后通过Nginx运行reverseproxy(除了pm2不想运行之外,这似乎是可行的)。提前谢谢

下面是我的Dockerfile的(稍微简化)版本:

### BUILD STAGE ###

FROM node:10-alpine as build-stage
WORKDIR /app

# Copy only package(-lock).json to enable docker caching
COPY /index/package*.json /app/index/

# Install packages before copying source code to use cache where possible
WORKDIR /app/index
RUN npm install

# Copy source code
WORKDIR /app
COPY . .

# Build source code
WORKDIR /app/index
RUN npm run build

### END BUILD STAGE ###

### PRODUCTION STAGE ###

FROM nginx:1.17-alpine as production-stage
ARG env_name=dev

# Install system dependencies (nodejs to run pm2)
RUN apk add --update nodejs nodejs-npm

# Copy transpiled sourcecode to production image
COPY --from=build-stage /app/index/.nuxt /app/index

# Copy config files to production image
WORKDIR /app
COPY deployment/pm2.js ./ecosystem.config.js
COPY deployment/nginx.${env_name}.conf /etc/nginx/nginx.conf

# Install pm2 globally
RUN npm install pm2 -g
RUN pm2 list

EXPOSE 80
CMD ["pm2-runtime", "start", "--env", ${env_name}, "&&", "nginx", "-g", "daemon off;"]

### END PRODUCTION STAGE

您确定要这样定义CMD吗

CMD[“pm2运行时”、“开始”、“pm2.json”]

因为从我看到的错误消息中显示它正在查找
[pm2 runtime,
(注意开头的
[
,结尾的
)只有在pm2运行时没有引号的情况下,这才有可能。我建议您删除并再次键入这些引号,保存Dockerfile,然后再次尝试构建

我只是用一个简单的例子进行了测试

FROM alpine

CMD [echo, "'A'" ]
并收到了类似的错误消息

/bin/sh: [echo,: not found

因此,我很确定情况就是这样的

问题是CMD指令无法处理多个现成的命令

将CMD更改为以下行修复了我的问题:

CMD ["sh", "-c", "nginx && pm2-runtime start ecosystem.config.js --env $env_name"]

Docker CMD&ENTRYPOINT使用sh-c隐式运行命令,但要链接命令和/或注入环境变量,您需要用自己的代码“嵌套”Docker的
sh-c

遗憾的是,这并不是那么简单:(我仔细检查了一下,下面是文字行的屏幕截图:在屏幕截图中,在“&&&”之后没有不是你提供的代码不起作用,而是我在我的问题中的代码片段中提供的。这是一行CMD的屏幕截图。逗号在“&&&”不过这是一个很好的发现,我现在要试试。仍然是一样的。我甚至删除了每个docker图像/容器,并在没有缓存的情况下重建…而且,如果我只是执行CMD[“pm2 runtime”,“list”]或类似的操作,我会得到相同的错误。