我不確定我可能做錯了什么,但我的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如下所示:
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:第 2 行:npm:未找到
我希望腳本應該能夠從環境中獲取已經安裝的 npm。
我可以做些什么不同的事情來完成這項作業?
uj5u.com熱心網友回復:
您正在嘗試運行兩個單獨的程式,因此請在兩個單獨的容器中運行它們。
# Dockerfile.app
FROM node:16.14.2
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . ./
ENV HOST 0.0.0.0
ENV NODE_ENV production
EXPOSE 8080
CMD npm run start
# Dockerfile.nginx
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/configfile.template
你可以使用像 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 配置中,確保proxy_pass http://app:8080使用 Compose 服務名稱和服務正在偵聽的埠號將請求轉發到另一個容器。
(Nginx Dockerfile 看起來很短,但它是正確的。Docker Hubnginx映像已經知道如何envsubst在它自己的入口點腳本中從您的腳本運行該行,并且它已經有一個正確的默認命令。)
您在問題中顯示的設定中有兩個基本問題,都與嘗試在同一個容器中運行兩個程式有關。第一個是你不能合并鏡像,第二FROM行會讓 Docker 從新的基礎鏡像重新開始。(因此您的最終映像僅包含Nginx,而不包含 Node 或您構建的應用程式,因此會npm not found出現錯誤。)您將遇到的第二個問題是您的腳本將啟動您的應用程式,但在應用程式退出之前不會啟動 Nginx 代理。對此有一些常見的解決方法(例如使用后臺行程),但它本質上會導致一個行程或另一個行程不受 Docker 監控,因此您的應用程式可能會失敗并且 Docker 不會注意到它能夠重新啟動它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/532332.html
