Docker CMD无法识别pm2-runtime

时间:2019-06-19 14:54:52

标签: docker nginx pm2 nuxt

我正在尝试构建结合了nginx和pm2的docker映像,但是当我尝试执行this之类的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运行反向代理(看起来有效,除了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

2 个答案:

答案 0 :(得分:1)

确定要这样定义CMD

CMD [ "pm2-runtime", "start", "pm2.json" ]

因为我看到的错误消息是说它正在寻找[pm2-runtime,(请注意开头的[和结尾的,),并且只有在您在pm2-运行时周围没有引号。我建议您删除并再次输入这些引号,保存Dockerfile并尝试再次构建。

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

FROM alpine

CMD [echo, "'A'" ]

并收到类似的错误消息

/bin/sh: [echo,: not found

所以我可以肯定的是这种情况

答案 1 :(得分:0)

问题是CMD指令无法立即处理多个命令。

将CMD更改为以下行解决了我的问题:

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

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