<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
官方檔案:
Dockerfile 範例:
Dockerfile 結構主要分為四部分:
docker build -t text:v1 . --no-cache # 要在構建後將映像標記到多個儲存庫中,請在執行命令-t時新增多個引數 docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest . ### 引數解釋 # -t:指定映象名稱 # . :當前目錄Dockerfile # -f:指定Dockerfile路徑 # --no-cache:不快取
# 非互動式執行 docker run centos:7.4.1708 /bin/echo "Hello world" ### 互動式執行 # -t: 在新容器內指定一個偽終端或終端。 #-i: 允許你對容器內的標準輸入 (STDIN) 進行互動。 # 會登入到docker環境中,互動式 docker run -it centos:7.4.1708 /bin/bash # -d:後臺執行,加了 -d 引數預設不會進入容器 docker run -itd centos:7.4.1708 /bin/bash ### 進入容器 # 在使用 -d 引數時,容器啟動後會進入後臺。此時想要進入容器,可以通過以下指令進入: #docker exec -it :推薦大家使用 docker exec -it 命令,因為此命令會退出容器終端,但不會導致容器的停止。 #docker attach:容器退出,會導致容器的停止。 docker exec -it b2c0235dc53 /bin/bash docker attach b2c0235dc53
語法格式:
ARG <引數名>[=<預設值>]
範例:
# 在FROM之前定義ARG,只在 FROM 中生效 ARG VERSION=laster FROM centos:${VERSION} # 在FROM之後使用,得重新定義,不需要賦值 ARG VERSION RUN echo $VERSION >/tmp/image_version
語法格式:
FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
範例:
ARG VERSION=latest FROM busybox:$VERSION # FROM --platform="linux/amd64" busybox:$VERSION ARG VERSION RUN echo $VERSION > image_version
語法格式:
MAINTAINER <name>
範例:
LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"
作用:
語法格式:
# 後面路徑是容器內的路徑,對應宿主機的目錄是隨機的 VOLUME ["<路徑1>", "<路徑2>"...] VOLUME <路徑>
範例:
FROM ubuntu RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol
語法格式:
範例:
# 以下三種寫法等價 RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]
語法格式:
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
範例:
# 新增所有以「hom」開頭的檔案: COPY hom* /mydir/ # ?替換為任何單個字元,例如「home.txt」。 COPY hom?.txt /mydir/ # 使用相對路徑,並將「test.txt」新增到<WORKDIR>/relativeDir/: COPY test.txt relativeDir/ # 使用絕對路徑,並將「test.txt」新增到/absoluteDir/ COPY test.txt /absoluteDir/ # 修改檔案許可權 COPY --chown=55:mygroup files* /somedir/ COPY --chown=bin files* /somedir/ COPY --chown=1 files* /somedir/ COPY --chown=10:11 files* /somedir/
ADD 指令和 COPY 的使用格類似(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
語法格式:
ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
範例:
# 萬用字元 ADD hom* /mydir/ # 相對路徑,拷貝到WORKDIR目錄下relativeDir/ ADD test.txt relativeDir/ # 絕對路徑 ADD test.txt /absoluteDir/ # 更改許可權 ADD --chown=55:mygroup files* /somedir/ ADD --chown=bin files* /somedir/ ADD --chown=1 files* /somedir/ ADD --chown=10:11 files* /somedir/
ADD 和 COPY 的區別和使用場景:
語法格式:
ENV <key1>=<value1> <key2>=<value2>... # 省略"="此語法不允許在單個ENV指令中設定多個環境變數,並且可能會造成混淆。 ENV <key> <value>
範例:
ENV JAVA_HOME=/usr/local/jdk ENV MY_NAME="John Doe" MY_DOG=Rex The Dog MY_CAT=fluffy # 此語法不允許在單個ENV指令中設定多個環境變數,並且可能會造成混淆。 ENV JAVA_HOME /usr/local/jdk
語法格式:
WORKDIR <工作目錄路徑>
範例:
FROM busybox ENV FOO=/bar WORKDIR ${FOO} # WORKDIR /bar
語法格式:
USER <使用者名稱>[:<使用者組>] USER <UID>[:<GID>]
範例:
FROM busybox RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin USER admin:admin # USER 9999:9999
作用:
語法格式:
# 預設情況下,EXPOSE假定 TCP。 EXPOSE <port> [<port>/<protocol>...]
範例:
EXPOSE 80/TCP 443/TCP EXPOSE 80 443 EXPOSE 80/tcp EXPOSE 80/udp
語法格式:
CMD <shell 命令> CMD ["<可執行檔案或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程式提供預設引數
範例:
CMD cat /etc/profile CMD ["/bin/sh","-c","/etc/profile"]
語法格式:
# exec形式,這是首選形式: ENTRYPOINT ["executable", "param1", "param2"] # 外殼形式: ENTRYPOINT command param1 param2
範例:
FROM ubuntu ENTRYPOINT ["top", "-b"] # CMD作為ENTRYPOINT引數 CMD ["-c"] # 與下面的等價 ENTRYPOINT ["top", "-b -c"] ENTRYPOINT top -b -c
語法格式:
HEALTHCHECK [OPTIONS] CMD command(通過在容器內執行命令檢查容器執行狀況) HEALTHCHECK NONE(禁用從基礎映像繼承的任何執行狀況檢查)
選項CMD有:
命令的exit status指示容器的執行狀況。可能的值為:
範例:
FROM nginx MAINTAINER Securitit HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/ || exit 1 CMD ["usr/sbin/nginx", "-g", "daemon off;"]
語法格式:
ONBUILD <其它指令>
範例:
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
語法格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
範例:比如我們可以新增映象的作者
LABEL org.opencontainers.image.authors="runoob"
當用戶同時在 kubernetes 中的 yaml 檔案中寫了command和args的時候,預設是會覆蓋DockerFile中的命令列和引數,完整的情況分類如下:
Dockerfile FROM centos COPY test.sh / RUN chmod +x /test.sh ### ENTRYPOINT將作為的子命令啟動/bin/sh -c,它不會傳遞引數,要傳遞引數只能這樣傳參 # ENTRYPOINT ["/bin/sh","-c","/test.sh ENTRYPOINT"] ENTRYPOINT ["/test.sh","ENTRYPOINT"] CMD ["CMD"]
/tmp/test.sh
#!/bin/bash echo $*
構建
docker build -t test1:v1 -f Dockerfile .
yaml 編排
cat << EOF > test1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: nodeName: local-168-182-110 containers: - name: test image: test:v1 #command: ['/bin/sh','-c','/test.sh'] #args: ['args'] EOF
執行
kubectl apply -f test.yaml
cat << EOF > test2.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test2 spec: replicas: 1 selector: matchLabels: app: test2 template: metadata: labels: app: test2 spec: nodeName: local-168-182-110 containers: - name: test2 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD裡面的引數會被忽略 command: ['/test.sh'] # command帶引數 # command: ['/test.sh','command'] #args: ['args'] EOF
cat << EOF > test3.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test3 spec: replicas: 1 selector: matchLabels: app: test3 template: metadata: labels: app: test3 spec: nodeName: local-168-182-110 containers: - name: test3 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD裡面的引數會被忽略 # command: ['/test.sh'] # command帶引數 # command: ['/test.sh','command'] args: ['args'] EOF
cat << EOF > test4.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test4 spec: replicas: 1 selector: matchLabels: app: test4 template: metadata: labels: app: test4 spec: nodeName: local-168-182-110 containers: - name: test4 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD裡面的引數會被忽略 # command: ['/test.sh'] # command帶引數,command和args都會帶上 command: ['/test.sh','command'] args: ['args'] EOF
映象構建 Dockerfile 的介紹就到這裡了!
到此這篇關於Docker 映象構建保姆級入門實戰指南的文章就介紹到這了,更多相關Docker 映象構建內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45