我正在嘗試在我的 express 應用程式中使用 nginx,我正在按照這里的教程進行操作
https://cloud.google.com/community/tutorials/deploy-react-nginx-cloud-run
然后最后我看到了這個命令
CMD sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
請問上面的命令是做什么的?
最具體的是"envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"做什么?
另外,我如何在上面的命令之后運行另一個命令,因為我似乎不能有多個CMD陳述句。我需要在最后一個命令之后運行以下命令
CMD["node","server.js"]
uj5u.com熱心網友回復:
這里的目的sh -c已經精確地在一個陳述句中運行多個命令。后面的字串-c可以包含任意數量的命令,由命令分隔符分隔。只需添加更多,只要你喜歡。
CMD sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' && node server.js"
在某些時候,隨著命令列變得越來越復雜,將命令放在一個檔案中,COPY將它放入容器中,然后簡單地將那個檔案作為你的CMD. 您也可以在您的Dockerfile;
RUN printf '%s\n' >cmd.sh \
"envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf &&" \
"nginx -g 'daemon off;' &&" \
"node server.js"
# ...
CMD ["sh", "cmd.sh"]
至于這些命令的作用,
envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf
通過運行命令/etc/nginx/conf.d/default.conf從模板檔案生成;有關詳細資訊,請參閱其手冊頁。(美元符號前的反斜杠實際上并不是命令的一部分;它是必需的,因為封閉的字串由 Docker 解釋,它有自己的變數替換機制,如果美元符號不是,它將在構建時替換值' t 逃跑了;我們不希望這樣。)/etc/nginx/conf.d/configfile.tempenvsubst$PORT
&&
是一個命令分隔符,表示僅在前一個命令成功時才繼續。換句話說,a && b運行a,b如果a沒有失敗。(成功或失敗是通過檢查 的退出代碼來確定的,在您運行另一個外部命令之前a,該代碼也暫時在 shell 變數中可用。)$?
nginx -g 'daemon off;'
nginx以字串作為選項的引數運行-g。同樣,有關詳細資訊,請參閱手冊頁。
uj5u.com熱心網友回復:
sh -c只是意味著你給你的shell(sh)一個命令作為引數執行。在您的情況下,這就像在 docker 實體上的終端中鍵入 envsubst '\$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
“此行設定容器的 nginx 配置”。
要從您的 docker 實體運行節點,請使用
RUN node server.js
我建議快速閱讀 Docker run 和 cmd 命令:https ://www.geeksforgeeks.org/difference-between-run-vs-cmd-vs-entrypoint-docker-commands/
uj5u.com熱心網友回復:
具體到這個設定,三個答案:
永遠沒有理由使用CMD sh -c '...'. @tripleee 的回答描述了您sh -c一般何時需要。不過, DockerfileCMD指令有兩種形式,如果您使用它的shell 形式(該命令不是 JSON 陣列),那么 Docker 會自動sh -c為您插入包裝器。也就是說,您可以將其簡化為
CMD envsubst '$PORT' < /etc/nginx/conf.d/configfile.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'
少一級的參考。
nginx影像已經知道如何做到這一點。 從 Nginx 1.19 開始,Docker Hubnginx鏡像已經知道如何運行這個envsubst命令(在那個頁面搜索“在 nginx 配置中使用環境變數”),并且基礎鏡像已經有一個CMD啟動 Nginx 的。所以如果你把模板化的組態檔放在正確的位置,你就根本不需要這個啰嗦CMD了。
從鏈接到的頁面復制和調整完整的 Dockerfile:
FROM node:14-alpine as react-build
...
FROM nginx:alpine
COPY nginx.conf /etc/nginx/templates/default.conf.template
# NOTE: different path ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
COPY --from=react-build /app/build /usr/share/nginx/html
ENV PORT 8080
ENV HOST 0.0.0.0
EXPOSE 8080
# No CMD in this derived Dockerfile
此設定構建了一個靜態 React 應用程式。 它使用多階段構建首先將應用程式編譯為靜態檔案,然后將它們復制到 Nginx 映像中。
FROM node:14-alpine as react-build
WORKDIR /app
...
RUN yarn build
FROM nginx:alpine
COPY --from=react-build /app/build /usr/share/nginx/html
如果您需要使用 Nginx 代理服務器端應用程式,則需要在單獨的容器中運行它。你在一個單獨的問題中問這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/532737.html
標籤:Google Cloud Collective 节点.js码头工人Unix嘘谷歌云运行
上一篇:遠程服務器上的web戰爭java.lang.NoSuchMethodError但在本地很好
下一篇:文本檔案中的查找值替換
