【问题标题】:Docker CMD doesn't recognize pm2-runtimeDocker CMD 无法识别 pm2-runtime
【发布时间】:2019-11-02 08:50:16
【问题描述】:

我正在尝试构建一个结合了 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

【问题讨论】:

    标签: docker nginx pm2 nuxt.js


    【解决方案1】:

    问题在于 CMD 指令无法处理开箱即用的多个命令。

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

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

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

    【讨论】:

      【解决方案2】:

      你确定你是这样定义 CMD 的吗

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

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

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

      FROM alpine
      
      CMD [echo, "'A'" ]
      

      并收到类似的错误消息

      /bin/sh: [echo,: not found
      

      所以我很确定是这样的

      【讨论】:

      • 遗憾的是,这并不是那么简单 :( 我仔细检查过,这里是文字行的屏幕截图:imgur.com/a/kCn9Ria
      • 在屏幕截图中,“&&”后面没有 , 并且不是您提供的代码不起作用,而是 github.com/keymetrics/docker-pm2/blob/master/example-app/…
      • 我确实在我的问题的 sn-p 中提供了它。 imgur.com/a/34dr60j这里是一行CMD的截图。不过,“&&”后面的逗号很好,我现在要试试。
      • 还是一样。我什至删除了每个 docker 镜像/容器并在没有缓存的情况下重建...imgur.com/a/8xkgdci
      • 另外,如果我只是执行 CMD ["pm2-runtime", "list"] 或类似的操作,我会得到同样的错误。
      猜你喜欢
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2011-05-22
      相关资源
      最近更新 更多