簡體   English   中英

容器無法運行時如何進入 Docker 鏡像文件系統

[英]How to get into Docker image filesystem when Container Won't run

對無法啟動且在文件路徑上失敗的容器進行故障排除的最佳方法是什么? 我需要以某種方式進入圖像並列出並查看目錄和文件結構是否在我啟動后實際上是容器/圖像的內部,但如果它無法啟動,我有點不走運,對嗎?

▶ PORT=8080 && docker run -p 9090:${PORT} -e PORT=${PORT} gcr.io/ssss/s@sha256:5ad05d1d37baae8f548b08a41fa7c5d69465adb8acd4cc9b1703f2ed4ee361ec
Unable to find image 'gcr.io/ssss-1349/ssss@sha256:5ad05d1d37baae8f548b08a41fa7c5d69465adb8acd4cc9b1703f2ed4ee361ec' locally
sha256:5ad05d1d37baae8f548b08a41fa7c5d69465adb8acd4cc9b1703f2ed4ee361ec: Pulling from ssss-1349/ssss
cbdbe7a5bc2a: Already exists
15f7fe915f93: Already exists
3cae4fa026a7: Already exists
bfa729779926: Already exists
db6f693f3456: Pull complete
2e4c635245d4: Pull complete
6017db5d3271: Pull complete
Digest: sha256:5ad05d1d37baae8f548b08a41fa7c5d69465adb8acd4cc9b1703f2ed4ee361ec
Status: Downloaded newer image for gcr.io/ssss-1349/ssss@sha256:5ad05d1d37baae8f548b08a41fa7c5d69465adb8acd4cc9b1703f2ed4ee361ec
yarn run v1.22.4
$ node --optimize_for_size --trace-warnings --experimental-json-modules --no-warnings ./server/server.js
internal/modules/cjs/loader.js:1083
  throw err;
  ^

Error: Cannot find module '/dist/server/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:1080:15)
    at Function.Module._load (internal/modules/cjs/loader.js:923:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

它說'/dist/server/server.js'不存在,但我知道它必須存在,我復制了它,所以我需要在容器的操作系統內部達到峰值並以某種方式環顧四周以查看文件結構實際上是什么嘗試對其進行故障排除

Dockerfile

FROM node:14.8.0-alpine
ENV PORT 8080
WORKDIR dist
RUN yarn
COPY . ./
CMD [ "yarn", "start" ]

進入容器的一種可能性是通過調用 shell 並調用它手上的所需命令來“覆蓋”默認命令(就像在“普通”shell 中所做的那樣)。 這使您可以像在任何普通 Linux shell 中一樣在 docker 容器中工作。
查看docker run-interactive, -i選項。


例子

如果你想啟動你的容器,你可以運行例如運行bash (...或sh ,或者你正在使用的任何shell):

docker run -it <img_name> <arguments> bash

您指定的CMD將被覆蓋。

如果用戶為 docker run 指定參數,則它們將覆蓋 CMD 中指定的默認值。
docs.docker.com

這允許在你的容器中工作而不會弄亂你Dockerfile


附加信息

當您的容器正在運行時,這也適用於exec

docker exec -it <container_id> bash

編輯:還要注意以下命令: CMD [ "yarn", "start" ]

與 shell 形式不同,exec 形式不調用命令 shell
來自docs.docker.com

如果您想在 shell 中運行命令,請輸入以下內容: CMD [ "sh", "-c", "yarn", "start" ]

我經常使用這個.sh文件來提取 Docker 鏡像的內容。 $1是圖像名稱。 您可以修改要解壓縮到的目錄的路徑。

Image=$1
ContainID=$(docker run -d $Image)
docker cp $ContainID:./dist ./dist
docker rm -f $ContainID

暫無
暫無

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

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