簡體   English   中英

停止和運行 Docker 容器不會更新

[英]Stopping and running Docker container doesn't update

我正在嘗試學習 Docker。 也許我把它復雜化了。 我已經用 Nginx 構建了一個 Docker 容器,我只是想構建一個靜態 HTML 網站。 我最初只將 Hello World 放在我的 HTML 文件中並運行容器。 它出現在瀏覽器中。 然后我停止了容器並在 html 文件中添加了很多內容。 但是,當我啟動容器備份時,沒有任何變化,Hello World 是瀏覽器中唯一顯示的內容。 我想我不明白為什么它沒有隨我的 HTML 一起改變。 任何幫助將不勝感激。

我正在停止容器: $ docker stop web

我開始備份它: $ docker run -it --rm -d -p 8080:80 --name web webserver

當我停止它並且docker ps它沒有出現

此外,使用 docker restart 似乎根本沒有做任何事情

Docker 容器是不可變的,專門用於運行單個特定進程。 應該構建並運行圖像,並且不應更改容器的內容。

因此,在生產的最佳實踐中,您將根據附加了代碼/更新的圖像創建一個新容器。

雖然我知道有一些用例可以修改正在運行的容器,但它很大程度上取決於您使用的圖像以及生成的容器處理實時更改的能力(它是否緩存?)。

你在哪里修改了 HTML 文件? 容器內的 HTML 文件似乎沒有更新。

docker ps命令只顯示正在運行的容器。 您可以使用docker ps -a查看所有容器,包括已停止的容器。

一旦構建了 dockerfile,它的包含就不再是可變的。 因此,您可以采取其他一些途徑來實現目標。

  1. 您可以重建映像並重新運行它。 (也許是投入生產的最佳案例)
  2. 您可以構建映像以執行在 docker run 上動態綁定的文件。

要遵循第二條路徑:

  1. 編寫一個圖像來執行你的 ./index.html 而不將它復制到 dockerfile 上。
  2. docker run -it -v <HTML_LOCAL_PATH>:<HTML_CONTAINER> --rm -d -p 8080:80 --name web webserver

這通常發生在 Docker 容器不知道您在容器外的何處進行更改時。 容器中的代碼是您項目中代碼的副本,而不是代碼本身。 因此,您必須以某種方式告訴 Docker,“這是我的代碼庫,我希望您將其復制到您的容器中”。 為此,您使用volumes 我使用 Docker-compose 執行此操作並指定如下卷:

    volumes:
      - .:/usr/src/service
    working_dir: /usr/src/service

. 點表示您的工作目錄,而 : 另一側的內容是您的工作目錄被復制到的位置 - 在這種情況下,Docker 保存其容器化/usr/src/service位置是/usr/src/service (在 unix 系統(Mac、Linux)上,位於至少,我不確定這是否適用於 Windows)。

working_dir 命令告訴 Docker 監聽容器內服務目錄中發生的事情的變化。

如果您現在運行您的應用程序並進行更改,並且在工作目錄中運行像 Nodemon 等的實時服務器類型的服務,它通常會選擇這些更改並顯示您編輯的 html 內容。

如果您對 Dockerfile、package.json 或其他“構建文件”進行了更改,則必須運行docker-compose up --build才能將這些更改放入容器中。 如果您只是更改常規源代碼docker-compose up只能運行docker-compose up

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM