<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] > [參考](https://bingohuang.gitbooks.io/docker_practice/content/image/build.html) ## 概述 `docker commit`中,了解到鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 `Dockerfile` ## 實例 ### 用 Dockerfile 制作鏡像 Dockerfile ``` FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ``` ``` docker build -t nginx:v3 ./ 注釋: -t 指定倉庫與標簽 ./ 為上下文的目錄,所以不能那個絕對路勁,或者 ../ Dockerfile 無法理解 ``` ### 如果Dockerfile 中有網絡操作如(yum) 則編譯是添加網絡類型 host 或則 macvlan ``` docker build -t nginx:v3 ./ --network host ``` ## Dockerfile 命令 ### RUN 執行命令 1. 方式一: shell 格式 命令: `RUN <命令>` `RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html` 2. 方式二: exec 格式 `RUN ["可執行文件", "參數1", "參數2"]` ### COPY 復制文件 ``` COPY <源路徑>... <目標路徑> COPY ["<源路徑1>",... "<目標路徑>"] ``` 如: ``` COPY package.json /usr/src/app/ COPY hom* /mydir/ COPY hom?.txt /mydir/ ``` 可是使用通配符,源路徑可為絕對路徑或者工作路徑的相對路徑 ### ADD 更高級的復制文件 盡可能的使用 COPY,因為 COPY 的語義很明確,就是復制文件而已,而 ADD 則包含了更復雜的功能 最適合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合 ``` FROM scratch //解壓 tar.gz 并放到 / 目錄 ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / ... ``` ### CMD 容器啟動命令 CMD 指令的格式和 RUN 相似,也是兩種格式 在指令格式上,一般推薦使用 exec 格式,這類格式在解析時會被解析為 JSON 數組,因此一定要使用雙引號 `"`,而不要使用單引號 ``` shell 格式:CMD <命令> exec 格式:CMD ["可執行文件", "參數1", "參數2"...] ``` 指定新的命令來替代鏡像設置中的這個默認命令, 比如,ubuntu 鏡像默認的 CMD 是` /bin/bash`,如果我們直接 `docker run -it ubuntu` 的話,會直接進入 bash。我們也可以在運行時指定運行別的命令,如 `docker run -it ubuntu cat /etc/os-release`。這就是用 `cat /etc/os-release` 命令替換了默認的 /bin/bash 命令了,輸出了系統版本信息 如果使用 shell 格式的話,實際的命令會被包裝為 sh -c 的參數的形式進行執行 ``` CMD echo $HOME //實際 CMD [ "sh", "-c", "echo $HOME" ] ``` Docker 不是虛擬機,容器中的應用都應該以前臺執行,而不是像虛擬機、物理機里面那樣,用 `upstart/systemd` 去啟動后臺服務,容器內沒有后臺服務的概念 **正確的守護進程** ``` //錯誤 CMD service nginx start //正確 CMD ["nginx", "-g", "daemon off;"] ``` ### ENTRYPOINT 入口點 查看 `ENTRYPOINT 入口點`目錄 ### ENV 設置環境變量 格式有兩種: ``` ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>... ``` 如: ``` ENV VERSION=1.0 DEBUG=on \ NAME="Happy Feet" ``` 如何使用變量 `$NODE_VERSION` ``` ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s /usr/local/bin/node /usr/local/bin/nodejs ``` ### VOLUME 定義匿名卷 對于數據庫類需要保存動態數據的應用,其數據庫文件應該保存于卷(volume)中,為了防止運行時用戶忘記將動態文件所保存目錄掛載為卷,在 Dockerfile 中,我們可以事先指定某些錄掛載為匿名卷. **匿名卷** `VOLUME /data` 任何向 `/data` 中寫入的信息都不會記錄進容器存儲層,從而保證了容器存儲層的無狀態化 可通過運行時候指定,進行替換 `docker run -d -v mydata:/data xxxx ### EXPOSE 聲明端口 `EXPOSE <端口1> [<端口2>...]` 只是用來申明端口,運行時并不會因為這個聲明應用就會開啟這個端口的服務, 另一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口 ### WORKDIR 指定工作目錄 `WORKDIR <工作目錄路徑>` ``` FROM python:2.7 WORKDIR /code ADD . /code ``` ### USER 指定當前用戶 `USER <用戶名>` USER 指令和 WORKDIR 相似,都是改變環境狀態并影響以后的層。WORKDIR 是改變工作目錄,USER 則是改變之后層的執行 RUN, CMD 以及 ENTRYPOINT 這類命令的身份,用戶需事先建立 ``` RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN [ "redis-server" ] ``` #### 在 root 執行期間,切換 用戶 建議使用 gosu ``` // 建立 redis 用戶,并使用 gosu 換另一個用戶執行命令 RUN groupadd -r redis && useradd -r -g redis redis // 下載 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true // 設置 CMD,并以另外的用戶執行 CMD [ "exec", "gosu", "redis", "redis-server" ] ``` ## 其他說明 ### FROM scratch 空鏡像 ``` FROM scratch ... ``` 如果你以 `scratch` 為基礎鏡像的話,意味著你不以任何鏡像為基礎,使用 Go 語言 開發的應用很多會使用這種方式來制作鏡像,這也是為什么有人認為 Go 是特別適合容器微服務架構的語言的原因之一 ### 不要過多使用 RUN 不好 ``` FROM debian:jessie RUN apt-get update RUN apt-get install -y gcc libc6-dev make RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install ``` 好 ``` FROM debian:jessie RUN buildDeps='gcc libc6-dev make' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ && rm -rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm -r /usr/src/redis \ && apt-get purge -y --auto-remove $buildDeps ``` > 每一個 RUN 的行為,就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執行這些命令,執行結束后,commit 這一層的修改,構成新的鏡像 > 要經常提醒自己,這并不是在寫 Shell 腳本,而是在定義每一層該如何構建 > 命令的最后添加了清理工作的命令,刪除了為了編譯構建所需要的軟件,清理了所有下載、展開的文件,并且還清理了 apt 緩存文件。這是很重要的一步,每一層的東西并不會在下一層被刪除,會一直跟隨著鏡像。因此鏡像構建時,一定要確保每一層只添加真正需要添加的東西,任何無關的東西都應該清理掉 ### 上下文路徑 `COPY ./package.json /app/` 這并不是要復制執行 docker build 命令所在的目錄下的 package.json,也不是復制 Dockerfile 所在目錄下的 package.json,而是復制 上下文(context) 目錄下的 package.json。 因此,COPY 這類指令中的源文件的路徑都是相對路徑。這也是初學者經常會問的為什么 `COPY ../package.json /app` 或者 `COPY /opt/xxxx /app` 無法工作的原因,因為這些路徑已經超出了上下文的范圍,Docker 引擎無法獲得這些位置的文件。如果真的需要那些文件,應該將它們復制到上下文目錄中去
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看