簡體   English   中英

如何完全像在Dockerfile中一樣運行Docker cmds

[英]How do I Run Docker cmds Exactly Like in a Dockerfile

Docker如何在Dockerfile中運行命令與啟動容器后手動運行命令之間似乎有所不同。 這似乎是由於您可以啟動的外殼類型所致,是一種(我認為)具有Dockerfile的非交互式外殼,而在運行諸如docker run -it docker run -it <some-img-id>類的交互式外殼時。

如何調試Docker容器中正在運行的命令,使其運行與從Dockerfile運行的命令完全相同? 只需將/bin/bash --noprofile添加到run cmd就足夠了? 從Dockerfile啟動時,環境是否還有其他不同?

簡短答案1:

如果Dockerfile不使用USERSHELL命令,則此操作:

docker --entrypoint "/bin/sh -c" -u root <image> cmd

簡短答案2:

如果在構建后不壓縮或壓縮映像,則Docker將為每個Dockerfile命令創建映像層。 您可以在--->的每一步結束時在docker build的輸出中看到它們:

Step 2/8 : WORKDIR /usr/src/app
  ---> 5a5964bed25d # <== THIS IS IMAGE ID OF STEP 2
Removing intermediate container b2bc9558e499
Step 3/8 : RUN something
  ---> f6e90f0a06e2 # <== THIS IS IMAGE ID OF STEP 3
Removing intermediate container b2bc9558e499

在您要調試的RUN步驟之前查找映像ID(例如,要調試上面的第3步,請使用步驟2映像ID)。 然后只需在該圖像中運行命令:

docker run -it 5a5964bed25d cmd

長答案1:

當您運行docker run [image] cmd Docker實際上是通過以下方式啟動cmd

  • cmd作為參數執行圖像的默認入口點。 入口點通過ENTRYPOINT命令存儲在構建時的ENTRYPOINT中。 即,如果cmdmy-app ,入口點是/bin/sh -c ,它將執行/bin/sh -c my-app
  • 使用映像的默認用戶ID啟動它,該ID由Dockerfile中的最后一個USER命令定義
  • 使用來自映像的Dockerfile的所有ENV命令的環境變量啟動它

當docker docker build運行Dockerfile RUN ,它確實完全相同,只是使用了Dockerfile當時(行)的值。

確切地說,您必須在運行行之前獲取ENV的值和最后一個USER命令,並在docker run命令中使用這些值。

大多數常見映像都將/bin/sh -c/bin/bash -c作為入口點,並且很可能該構建是由root用戶操作的。 因此, docker --entrypoint "/bin/bash -c" -u root <image> cmd應該足夠

您正在體驗的是由於外殼而引起的行為。 我們大多數人都習慣於使用bash shell。 因此,通常我們會嘗試以以下方式運行命令

對於新容器

docker run -it <imageid> bash

對於現有容器

docker exec -it <containerid> bash

但是當我們在Dockerfile中使用RUN指令指定一些命令時

RUN echo Testing

然后,這等效於運行/bin/sh -c 'echo Testing' 因此,您可以期待某些差異,因為兩個外殼都不同。

在Docker 1.12或更高版本中,您有一個名為SHELL的Dockerfile指令,這使您可以覆蓋默認的SHELL

SHELL ["/bin/bash", "-c"]
RUN echo Testing

這將使RUN命令作為bash -c 'echo Testing' 您可以在此處了解有關SHELL指令的更多信息

暫無
暫無

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

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