![](/img/trans.png)
[英]How do I write a Dockerfile which changes a protected text file in the docker image?
[英]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不使用USER
和SHELL
命令,則此操作:
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
中。 即,如果cmd
是my-app
,入口點是/bin/sh -c
,它將執行/bin/sh -c my-app
。 USER
命令定義 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.