Docker CMD не распознает pm2-runtime - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь создать образ докера, который объединяет nginx и pm2, но когда я пытаюсь выполнить pm2 как this , но когда я выполняю его таким образом, я получаю следующую ошибку:

/bin/sh: [pm2-runtime,: not found

Странная вещь в том, что если я переопределяю CMD и использую его следующим образом:

sudo docker run -it -p 80:80 frontend-test pm2-runtime

Он признает, что pm2 (-runtime) установлен.У кого-нибудь есть идея, как эта черная магия может произойти?В предыдущей версии я генерировал нукст-страницы и обслуживал их статически через Nginx, но теперь я хочу преобразовать это в режим 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 ]

1 голос
/ 20 июня 2019

Вы уверены, что определяете CMD как

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

потому что, как я вижу, в сообщении об ошибке говорится, что оно ищет [pm2-runtime, (обратите внимание на [ в начале и , в конце), и это возможно только в том случае, если у вас нет цитаты вокруг pm2-runtime. Я бы посоветовал вам удалить и снова ввести эти кавычки, сохранить Dockerfile и повторить сборку.

Я только что протестировал на простом примере

FROM alpine

CMD [echo, "'A'" ]

И получил похожее сообщение об ошибке

/bin/sh: [echo,: not found

Так что я вполне уверен, что это так

0 голосов
/ 28 июня 2019

Проблема была в том, что директива CMD не может обрабатывать несколько команд из коробки.

Изменение CMD на следующую строку устранило мою проблему:

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

Docker CMD & ENTRYPOINTзапускает команды неявно с помощью sh -c, но чтобы объединить команды и / или внедрить переменные окружения, вам нужно "вложить" sh -c из докера с вашим собственным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...