總體來說, COPY,ADD,RUN 都是增加鏡像層(不一定會,要看緩存情況)。
CMD 和ENTRYPOINT 用于配制容器為像一個執(zhí)行文件
COPY & ADD
COPY . /src
新建一個鏡像層,把文件拷貝進去
如果這條命令已經緩存了,Docker 會繼續(xù)查找同樣基于上一層鏡像的執(zhí)行了 COPY . /src 命令的鏡像。
還有 COPY 和 ADD 還會檢查復制的文件 Checksum 值,如果文件發(fā)生了改變也會設置混存無效。
在執(zhí)行 Dockerfile 構建鏡像的過程中一旦某一行命令出現(xiàn)緩存無效,之后的都不使用緩存 所以盡可能將發(fā)生改變的命令放在 Dockerfile 文件下面
ADD <url> <dest>
ADD 可以將 Host 以外的文件,或者 tar 壓縮包(解壓后)當到 容器內。
如果只是拷貝目錄,用 COPY
RUN,CMD 和 ENTRYPOINT
設置容器啟動默認執(zhí)行到動作,或者參數。
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo", "Hello world"]
RUN
創(chuàng)建一個鏡像層
shell 模式顧名思義就是在 shell 里執(zhí)行,exec 模式就是可執(zhí)行文件絕對路徑加參數。
區(qū)別于 CMD 和 ENTRYPOINT RUN命令的作用是增加一個景象層
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
把 update 寫在一個RUN里是為了防止命中之前的 RUN apt-get update 緩存,那就不會創(chuàng)建一個新的鏡像層,也就等于沒有執(zhí)行更新動作了。
RUN 運行方式
RUN <command> (shell form)
RUN ["executable", "param1", "param2"] (exec form)
CMD
定義默認的容器啟動命令,
或者為 exec 模式的 ENTRYPOINT 提供參數
第一點很好理解,docker run -it <image> 會執(zhí)行 Dockerfile 里面的 CMD,
如果給出了command 如 docker run -it <image> <command> Dockerfile 里的CMD命令就會被忽略。
CMD 有三種模式:
CMD ["executable","param1","param2"] (exec form, preferred)
CMD ["param1","param2"] (sets additional default parameters for ENTRYPOINT in exec form)
CMD command param1 param2 (shell form)
ENTRYPOINT
ENTRYPOINT 用來將容器變得像一個可執(zhí)行文件
ENTRYPOINT 兩種運行方式
- exec 模式的 ENTRYPOINT 跟 CMD 的區(qū)別是它可以接受來自 CMD 傳遞的參數,或者
docker run -it <image> 參數里的參數。注意docker run里的參數會覆蓋CMD里的。 - Shell 方式會忽略CMD 以及
docker run -it <image> 參數里的參數