一些 Dockerfile 有
RUN bash -c "apt-get update -qq && ... \"
而其他人則不帶引號,例如
RUN apt-get update -qq && ... \
這些變體之間有什么區別?其中一個比另一個更可取嗎?
uj5u.com熱心網友回復:
您應該只撰寫RUN apt-get update ...而不手動插入sh -c包裝器。
、RUN和指令CMD都ENTRYPOINT共享相同的語法。這是最好的檔案,ENTRYPOINT但所有三個命令的作業方式相同。有兩種方法可以為它們撰寫命令:您可以提供一組特定的命令詞作為 JSON 陣列(exec 形式),或者您可以撰寫一個字串,Docker 會自動包裝它sh -c(shell 形式)。例如:
# Create a directory with a space in its name
RUN mkdir "a directory"
# JSON-array form: each array element is a shell word
RUN ["ls", "-ld", "a directory"]
# String form: Docker provides a shell, so these two are equivalent
RUN ls -ld 'a directory'
RUN ["/bin/sh", "-c", "ls -ld 'a directory'"]
這使您的第一個表單變得多余:如果您RUN bash -c '...'是 ,它是一個字串,Docker 會自動將其包裝在sh -c. 所以你生效
# RUN bash -c '...'
RUN ["/bin/sh", "-c", "bash -c '...'"]
GNU bash 有許多不是 POSIX 標準語法的擴展,這些擴展可能會遇到麻煩,特別是在基于 Alpine 的映像上,其中/bin/sh是 BusyBox 工具集中的最小外殼。我可以將其視為強制使用 bash 而不是默認 shell 運行 shell 命令的嘗試。對于 Dockerfile 中出現的大多數內容,它們通常不會太復雜以至于無法用標準語法輕松重寫。
# Needs bash for the non-standard `source` syntax
RUN bash -c 'source ./venv/bin/activate && pip list'
# But you can use the standard `.` instead
RUN . ./venv/bin/activate && pip list
如果您必須有 bash 解釋RUN行,那么我建議使用該SHELL指令來更改用于解釋裸字串的命令。
在風格方面,我偶爾也會看到以顯式CMD ["/bin/sh", "-c", "..."]. 沒有理由把它寫出來。使用字串形式更短且同樣清晰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/467633.html
標籤:码头工人 dockerfile
上一篇:如何將臨時卷轉換為持久卷宣告
