我不知道我可能做错了什么,但我有下面的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。
我能做些什么来让它发挥作用呢?
1条答案
按热度按时间bvjxkvbb1#
您正尝试运行两个独立的程序,因此请在两个独立的容器中运行它们。
第一个
您可以使用Docker Compose之类的系统来同时运行这两个部分:
运行
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不会注意到它,从而无法重新启动它。