我嘗試在 azure 上部署基于節點(節點:最新)的影像。當我這樣做時,它會自動終止,并且不會讓我做我需要做的事情。
我的碼頭檔案:
WORKDIR /usr/src/app
COPY package.json .
COPY artillery-scripts.sh .
COPY images images
COPY src src
EXPOSE 80
RUN npm install -g artillery && \
npm install faker && \
npm install worker && \
npm install -g node-fetch -save && \
npm install -g https://github.com/preguica/artillery-plugin-metrics-by-endpoint.git
我嘗試 && \ while true; do echo SLEEP; sleep 10; done在最后添加,因此它不會自動終止,但這會產生錯誤。
有誰知道這是什么問題?
uj5u.com熱心網友回復:
最好先在本地嘗試一下。您似乎誤解了 docker 的一些基本部分。在 Dockerfile 中撰寫會暫停的內容完全沒有意義,因為該檔案用于構建映像,而不是運行容器。
獲得鏡像后,您可以基于該鏡像運行一個或多個容器。通常你會想要在末尾放置一個 CMD 或 ENTRYPOINT 來告訴容器要運行什么命令。閱讀這篇文章,它對兩者都有很好的解釋。
如果您想與容器互動,請查看運行命令的 -i 和 -t(或簡稱 -it)標志。當您運行容器時,您還可以提供一個命令,這將覆寫 CMD 中給出的任何命令或附加到 ENTRYPOINT 中的任何內容。如果您不撰寫 ENTRYPOINT 或 CMD,它將默認運行 shell。但是,如果你在沒有 -it 的情況下運行它,它將啟動 shell,認為它已經完成并立即停止。
同樣,如果您想啟動一個特定的腳本,例如您可以在 Dockerfile 的末尾添加一行,例如
CMD "node somefile.js"
所以首先基于 dockerfile 構建你的鏡像,然后基于鏡像運行容器:
docker build -t someImageName:someTag .
docker run -it someImageName:someTag // will run CMD, "node somefile.js" or:
docker run -it someImageName:someTag node // will override it and just run node
您可以在本地安裝 docker,然后在本地機器上完成所有操作,一旦您對它有所了解,并且一旦您確定您的 dockerfile 是正確的,請查看如何將其部署到 azure。這樣更容易除錯和學習。
額外提示:您撰寫了 EXPOSE 80。請閱讀 EXPOSE 和 PUBLISH 上的檔案,因為它在您開始時可能會令人困惑。EXPOSE 只是用于檔案,它實際上并沒有公開任何東西。如果您想以某種方式從外部世界連接到容器,您必須發布埠。這是在運行命令中完成的:
docker run -it someImageName:someTag -p 80:80 // the first is host port, the second is the container port.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394245.html
