在Docker容器的shell脚本中使用npm run start命令时未找到NPM

pod7payv  于 2022-11-14  发布在  Docker
关注(0)|答案(1)|浏览(512)

我不知道我可能做错了什么,但我有下面的script.sh文件坐在我的项目的根:

脚本.sh

#!/bin/sh
npm run start
envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf
nginx -g 'daemon off;'

然后,我在Dockerfile中引用了上面的脚本,如下所示:

停靠文件

# Build environment
FROM node:16.14.2
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . ./

# server environment
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/configfile.template
ENV HOST 0.0.0.0
ENV NODE_ENV production
EXPOSE 8080

COPY script.sh /
RUN chmod +x /script.sh

ENTRYPOINT ["/script.sh"]

在成功构建Docker映像后,我尝试将其作为容器运行,但我一直得到的是以下错误:
/script.sh:第二行:npm:未找到
我希望脚本能够从环境中获取已经安装的npm。
我能做些什么来让它发挥作用呢?

bvjxkvbb

bvjxkvbb1#

您正尝试运行两个独立的程序,因此请在两个独立的容器中运行它们。
第一个
您可以使用Docker Compose之类的系统来同时运行这两个部分:

# docker-compose.yml
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.app
  nginx:
    build:
      context: .
      dockerfile: nginx
    ports:
      - 8080:80

运行docker-compose up -d将同时启动两个容器。在Nginx配置中,请确保使用Compose服务名和服务监听的端口号来运行proxy_pass http://app:8080,以将请求转发到另一个容器。
(The Nginx Dockerfile看起来很短,但它是正确的。Docker Hub nginx映像已经知道如何在它自己的入口点脚本中运行您的脚本中的envsubst行,并且它已经有了正确的默认命令。
问题中显示的设置有两个基本问题,都与在同一个容器中运行两个程序有关。第一个问题是你不能合并图像,第二行FROM会使Docker从新的基础图像开始。(因此最终的映像 * 只 * 包含Nginx,而不包含Node或构建的应用程序,因此出现npm not found错误。)第二个问题是,脚本将启动应用程序,但在应用程序退出之前不启动Nginx代理。有一些常见的解决方法(比如使用后台进程),但它本质上会导致一个进程或另一个进程不被Docker监视,因此您的应用程序可能会失败,Docker不会注意到它,从而无法重新启动它。

相关问题