您好,登錄后才能下訂單哦!
制作Docker image有兩種方式: 一是使用Docker container(docker save container_name -o test.tar ) ,再導出image,而是使用Dockerfile, 將所有動作導入到文件中,使用build命令制作成鏡像。
一,Dockerfile基本結構
一般的Dockerfile分為四個部分:基礎鏡像信息,維護者信息,鏡像操作指令和容器啟動時的指令
FROM nginx:1.13.5-alpine MAINTAINER SXY Team <http://cywx.cn> #設置時區 RUN echo 'Asia/Shanghai' >/etc/timezone ARG SIBE_VERSION=0 COPY images/files/entrypoint.sh /usr/local/bin/ RUN chmod u+x /usr/local/bin/entrypoint.sh # Update to get support for Zip/Unzip, Bash RUN apk --update add zip unzip bash wget ENV WWW_TARGET /var/www/html/ COPY images/files/mysite.template /etc/nginx/conf.d/default.conf ADD dist/ /tmp/ RUN mkdir -p ${WWW_TARGET} \ && mv /tmp/ ${WWW_TARGET} \ && rm -rf /tmp/ ENV MGMT_API_URL http://192.168.3.223:19980 ENV MGMT_API_AUTHORIZATION d2ViX2FwcDpjaGFuZ2VpdA== RUN cp /var/www/html/scripts/http/configuration.json /var/www/html/scripts/http/configuration.json.template RUN cp /var/www/html/scripts/http/configuration.json /var/www/html/scripts/http/configuration.json.template2 # forward request and error logs to docker log collector RUN mkdir -p /var/log/webui && ln -sf /dev/stdout /var/log/webui/access.log \ && ln -sf /dev/stderr /var/log/webui/error.log EXPOSE 80 443 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["nginx", "-g", "daemon off;"] entrypoint中的信息 [root@test-227 files]# cat entrypoint.sh #!/bin/bash setup() { echo "Configure 1 management api url to ${MGMT_API_URL}" cat /var/www/html/scripts/http/configuration.json.template | \ sed "s#http://192.168.3.223:19980#${MGMT_API_URL}#g" > /var/www/html/scripts/http/configuration.json.template2 cat /var/www/html/scripts/http/configuration.json.template2 echo "Configure 2 AUTHORIZATION to ${MGMT_API_AUTHORIZATION}" cat /var/www/html/scripts/http/configuration.json.template2 | \ sed "s#d2ViX2FwcDpjaGFuZ2VpdA==#${MGMT_API_AUTHORIZATION}#g" > /var/www/html/scripts/http/configuration.json cat /var/www/html/scripts/http/configuration.json } setup exec "$@"
FROM:指定基礎鏡像,要在哪個鏡像建立
FROM <image> 或者 FROM <image>:<tag>
第一條指令必須為FROM指令
MAINTAINER: 指定維護者信息
MAINTAINER <name>
RUN: 在鏡像中要執行的命令
RUN <command> 或者 RUN ["executable","param1","param2"]
前者將shell終端中運行命令,即/bin/bash -c;后者則使用exec執行,指定使用其他終端可以通過第二種方式實現,例如RUN ["/bin/bash", "-c", "echo hello"]
WORKDIR: 指定當前工作目錄,相當于cd
WORKDIR /path/to/workdir
為后續的RUN,CMD,ENTRYPOINT指令配置工作目錄,可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑,例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終的路徑/a/b/c
EXPOSE:指定容器需要被打開的端口
EXPOSE 80
告訴docker服務容器需要暴露的端口,但是目前只在容器中暴露,如果想要在節點進行暴露則需要-p 80:80,或者-P(主機將為其暴露一個隨機端口)
ENV: 定義環境變量
ENV <key> <value>
指定一個環境變量在容器中生成
ENV managementapi http://192.168.3.226
COPY: 復制本地dockerfile路徑根目錄下的文件到容器文件中
COPY <src> <dest>
ADD: 相當于COPY,但比COPY功能強大
ADD <src> <dest>
此命令也是將主機任何地方文件到容器文件中,但是可以復制tar文件時,也會自動展開
VOLUME: 掛載目錄
VOLUME ["/data"]
創建一個可以從本地主機或者其他容器的掛載點,一般用來存放數據
USER:
USER daemon
指定運行容器時的用戶名或UID,后續的RUN也會使用指定用戶。當服務不需要管理員權限時,可以通過該命令指定運行用戶,并且可以在之前創建需要的用戶 RUN useradd -s /sbin/nologin -M www。
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell)
配置容器啟動后執行的命令,并且不可被docker run參數覆蓋,每個Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最后一個生效
CMD:
支持三種格式
CMD ["executable","param1","param2"] 使用exec執行
CMD command1 command2 command3 在/bin/bash中執行,提供給需要交互應用
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啟動容器時執行的命令,每個Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最后一條會被執行,則會覆蓋掉CMD指定命令
ENTRYPOINT和CMD的區別: ENTRYPOINT指定了該鏡像啟動時入口,CMD則指定了容器啟動時的命令,當兩者共用時,完整的啟動命令像是ENTRYPOINT+CMD,使用ENTRYPOINT的好處是在我們啟動鏡像就像是啟動了一個可執行程序,在CMD上僅需要指定參數;另外在我們自定義CMD時不容易出錯
使用CMD的Dockerfile:
FROM mysql
CMD ["echo","test"]
使用ENTRYPOINT的Dockerfile
FROM mysql
ENTRYPOINT ["echo","test"]
ENTRYPOINT不能覆蓋掉執行時的參數,會把啟動鏡像是的命令當參數,而CMD可以覆蓋掉默認的參數
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。