Docker CMD 无法识别 pm2-runtime
Docker CMD doesn't recognize pm2-runtime
我正在尝试构建一个结合了 nginx 和 pm2 的 docker 映像,但是当我尝试像 this 那样执行 pm2 时,但是当我那样执行它时,出现以下错误:
/bin/sh: [pm2-runtime,: not found
奇怪的是,如果我覆盖 CMD 并像这样使用它:
sudo docker run -it -p 80:80 frontend-test pm2-runtime
它确实识别出安装了 pm2(-运行time)。任何人都知道这种黑魔法是如何发生的?之前的版本我生成了 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
你确定你是这样定义 CMD 的吗
CMD [ "pm2-runtime", "start", "pm2.json" ]
因为据我所见,错误消息说它正在寻找 [pm2-runtime,
(注意开头的 [
和结尾的 ,
),这是可能的仅当您没有 pm2-runtime 周围的引号时。我建议您删除并再次输入这些引号,保存 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 隐式运行命令,但是要链接命令 and/or 注入环境变量,您需要 "nest" 来自的 sh -c
docker 用你自己的。
我正在尝试构建一个结合了 nginx 和 pm2 的 docker 映像,但是当我尝试像 this 那样执行 pm2 时,但是当我那样执行它时,出现以下错误:
/bin/sh: [pm2-runtime,: not found
奇怪的是,如果我覆盖 CMD 并像这样使用它:
sudo docker run -it -p 80:80 frontend-test pm2-runtime
它确实识别出安装了 pm2(-运行time)。任何人都知道这种黑魔法是如何发生的?之前的版本我生成了 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
你确定你是这样定义 CMD 的吗
CMD [ "pm2-runtime", "start", "pm2.json" ]
因为据我所见,错误消息说它正在寻找 [pm2-runtime,
(注意开头的 [
和结尾的 ,
),这是可能的仅当您没有 pm2-runtime 周围的引号时。我建议您删除并再次输入这些引号,保存 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 隐式运行命令,但是要链接命令 and/or 注入环境变量,您需要 "nest" 来自的 sh -c
docker 用你自己的。