成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Docker 筆記(2):Dockerfile

DesGemini / 2011人閱讀

摘要:是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。每個(gè)中只能有一個(gè),當(dāng)指定多個(gè)時(shí),只有最后一個(gè)生效。是改變工作目錄,則是改變之后層的執(zhí)行以及這類(lèi)命令的身份。

Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。

常用的選項(xiàng)

例子:

FROM node:latest
MAINTAINER my_name
ADD ./my_project /code
VOLUME ["/data1", "/data2"]
WORKDIR /code
RUN apt-get install mysql
EXPOSE 6777
ENV SRC_URL www.xxxxxxxxxxx.com/xxxxxxx
RUN wget $SRC_URL
CMD ["node","bin/www"]

FROM: 指定基礎(chǔ)鏡像,如果本地不存在基礎(chǔ)鏡像,會(huì)自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)拉取。FROM必須是Dockerfile中除了注釋外的第一行語(yǔ)句。

MAINTAINER: 用于指定鏡像的構(gòu)建者,當(dāng)發(fā)現(xiàn)坑的時(shí)候可以找他

ADD: 將本機(jī)的文件或目錄復(fù)制到鏡像的某個(gè)目錄下,在后續(xù)的構(gòu)建命令和容器運(yùn)行中可以在容器中訪(fǎng)問(wèn)該目錄

WORKDIR: 指定后續(xù)的構(gòu)建命令的工作路徑

RUN: 在鏡像中運(yùn)行某條命令,如安裝相關(guān)的依賴(lài)庫(kù)

CMD:用于指定鏡像運(yùn)行時(shí)的第一條命令。CMD只能出現(xiàn)一次,如果出現(xiàn)多次,前面的會(huì)被覆蓋

    CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式;

    CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用;

    CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);

EXPOSE:暴露容器的端口,其他容器可以通過(guò)該端口訪(fǎng)問(wèn)本容器提供的服務(wù),前提是這些容器在同一個(gè)網(wǎng)絡(luò)中,例子中暴露了6777端口

ENV: 設(shè)置環(huán)境變量。這些環(huán)境變量可以在后續(xù)的構(gòu)建命令中使用,當(dāng)運(yùn)行容器時(shí),也可以在容器中使用這些變量

COPY: 將本機(jī)的文件或目錄復(fù)制到鏡像的某個(gè)目錄下,在后續(xù)的構(gòu)建命令和容器運(yùn)行中可以在容器中訪(fǎng)問(wèn)該目錄。該命令作用同ADD,只是ADD更加強(qiáng)大,如:當(dāng)拷貝的是壓縮包,ADD會(huì)自動(dòng)解壓

ENTRYPOINT: 容器啟動(dòng)后執(zhí)行的命令。每個(gè) Dockerfile 中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)時(shí),只有最后一個(gè)生效。(CMD指令指定的容器啟動(dòng)時(shí)命令可以被docker run指定的命令覆蓋;而ENTRYPOINT指令指定的命令不能被覆蓋,而是將docker run指定的參數(shù)當(dāng)做ENTRYPOINT指定命令的參數(shù)。)

    ENTRYPOINT ["executable", "param1", "param2"]

    ENTRYPOINT command param1 param2(shell中執(zhí)行)

VOLUME: 容器卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過(guò) UFS,將主機(jī)目錄掛在到容器里面,可以提供很多有用的特性:

數(shù)據(jù)卷 可以在容器之間共享和重用

對(duì) 數(shù)據(jù)卷 的修改會(huì)立馬生效

對(duì) 數(shù)據(jù)卷 的更新,不會(huì)影響鏡像

數(shù)據(jù)卷 默認(rèn)會(huì)一直存在,即使容器被刪除,除非在刪除容器的時(shí)候使用-v選項(xiàng): docker rm -v container_id/container_name

注意: 數(shù)據(jù)卷 的使用,類(lèi)似于 Linux 下對(duì)目錄或文件進(jìn)行 mount,鏡像中的被指定為掛載點(diǎn)的目錄中的文件會(huì)隱藏掉,能顯示看的是掛載的 數(shù)據(jù)卷 。因此你的容器目錄dir有一個(gè)文件為temp.data,如果你在dir掛載了一個(gè)數(shù)據(jù)卷

在Dockerfile中,無(wú)法指定主機(jī)上對(duì)應(yīng)的目錄

,那么你就再也不能讀取temp.data,除非你移除該數(shù)據(jù)卷。

其他選項(xiàng) USER

格式:

 USER <用戶(hù)名>

USER 指令和 WORKDIR 相似,都是改變環(huán)境狀態(tài)并影響以后的層。 WORKDIR 是改變工作目錄, USER 則是改變之后層的執(zhí)行 RUN , CMD 以及 ENTRYPOINT 這類(lèi)命令的身份。

當(dāng)然,和 WORKDIR 一樣, USER 只是幫助你切換到指定用戶(hù)而已,這個(gè)用戶(hù)必須是事先建立好的,否則無(wú)法切換。

RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]

如果以 root 執(zhí)行的腳本,在執(zhí)行期間希望改變身份,比如希望以某個(gè)已經(jīng)建立好的用戶(hù)來(lái)運(yùn)行某個(gè)服務(wù)進(jìn)程,不要使用 su 或者 sudo ,這些都需要比較麻煩的配置,而且在 TTY 缺失的環(huán)境下經(jīng)常出錯(cuò)。建議使用 gosu 。

# 建立 redis 用戶(hù),并使用 gosu 換另一個(gè)用戶(hù)執(zhí)行命令
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
# 設(shè)置 CMD,并以另外的用戶(hù)執(zhí)行
CMD [ "exec", "gosu", "redis", "redis-server" ]
ONBUILD

格式: ONBUILD <其它指令> 。

ONBUILD 是一個(gè)特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等,而這些指令,在當(dāng)前鏡像構(gòu)建時(shí)并不會(huì)被執(zhí)行。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像,去構(gòu)建下一級(jí)鏡像的時(shí)候才會(huì)被執(zhí)行。

Dockerfile 中的其它指令都是為了定制當(dāng)前鏡像而準(zhǔn)備的,唯有 ONBUILD 是為了幫助別人定制自己而準(zhǔn)備的。

fundamental/Dockerfile

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

project1/Dockerfile

FROM fundamental
do other thing

在構(gòu)建 project1 的時(shí)候 ONBUILD的命令才會(huì)生效。

例子

我們將基于官方的python鏡像,搭建一個(gè)后端的環(huán)境鏡像(需要用的庫(kù)含redis、flask等)。

FROM python:3.6-alpine
# 復(fù)制代碼到鏡像
ADD the_path_of_project /code   
# 設(shè)置后面的命令的pwd
WORKDIR /code
# 安裝依賴(lài)
RUN pip install redis flask
# 運(yùn)行服務(wù)的命令
CMD ["python", "app.py"]

例子中:

FROM:指定基礎(chǔ)鏡像為python:3.6-alpine

ADD:項(xiàng)目代碼被復(fù)制到容器的code目錄下

WORKDIR:指定后續(xù)命令的pwd為code

RUN:安裝依賴(lài)庫(kù)

CMD:指定啟動(dòng)容器時(shí)需要運(yùn)行的命令,即啟動(dòng)我們的項(xiàng)目

參考

docker pratice


上一節(jié):Docker 筆記(1):介紹、鏡像、容器及其基本操作

下一節(jié):Docker 筆記(3):docker-compose

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27454.html

相關(guān)文章

  • 慕課網(wǎng)_《Docker入門(mén)》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層。可選指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令。可選用于指定需要暴露的網(wǎng)絡(luò)端口號(hào)。可選向鏡像中掛載一個(gè)卷組。 時(shí)間:2017年09月16日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無(wú) 學(xué)習(xí)源碼:無(wú) 第一章:課程簡(jiǎn)介 1-1 課程介紹 Docke...

    CoorChice 評(píng)論0 收藏0
  • Dockerfile 與 Compose 環(huán)境搭建學(xué)習(xí)筆記(一)

    摘要:的主要作用是自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉(cāng)庫(kù)拿現(xiàn)成的使用。以接下來(lái)要構(gòu)建的環(huán)境來(lái)說(shuō)明下,下面我將要搭建一個(gè)的開(kāi)發(fā)環(huán)境,需要進(jìn)行配合。它的主要作用是持久化數(shù)據(jù),避免容器銷(xiāo)毀后內(nèi)部數(shù)據(jù)丟失暴露到宿主機(jī)的端口。 以前一直使用 Vagrant 作為自己的開(kāi)發(fā)環(huán)境,并且在上家公司也推行大家采用 Vagrant 作為開(kāi)發(fā)環(huán)境,保障公司使用的是同一套開(kāi)發(fā)環(huán)境。隨著docker的流...

    TZLLOG 評(píng)論0 收藏0
  • Dockerfile 與 Compose 環(huán)境搭建學(xué)習(xí)筆記(一)

    摘要:的主要作用是自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉(cāng)庫(kù)拿現(xiàn)成的使用。以接下來(lái)要構(gòu)建的環(huán)境來(lái)說(shuō)明下,下面我將要搭建一個(gè)的開(kāi)發(fā)環(huán)境,需要進(jìn)行配合。它的主要作用是持久化數(shù)據(jù),避免容器銷(xiāo)毀后內(nèi)部數(shù)據(jù)丟失暴露到宿主機(jī)的端口。 以前一直使用 Vagrant 作為自己的開(kāi)發(fā)環(huán)境,并且在上家公司也推行大家采用 Vagrant 作為開(kāi)發(fā)環(huán)境,保障公司使用的是同一套開(kāi)發(fā)環(huán)境。隨著docker的流...

    ityouknow 評(píng)論0 收藏0
  • 程序員筆記——如何編寫(xiě)優(yōu)雅的Dockerfile

    摘要:導(dǎo)讀要從容器化開(kāi)始,而容器又需要從開(kāi)始,本文將介紹如何寫(xiě)出一個(gè)優(yōu)雅的文件。只要記住以上三點(diǎn)就能寫(xiě)出不錯(cuò)的。執(zhí)行完成項(xiàng)目的構(gòu)建。 導(dǎo)讀 Kubernetes要從容器化開(kāi)始,而容器又需要從Dockerfile開(kāi)始,本文將介紹如何寫(xiě)出一個(gè)優(yōu)雅的Dockerfile文件。 文章主要內(nèi)容包括: Docker容器 Dockerfile 使用多階構(gòu)建 感謝公司提供大量機(jī)器資源及時(shí)間讓我們可以實(shí)踐...

    曹金海 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<