Dockerfile是一個文本格式的配置文件频鉴,用戶可以使用Dockerfile快速創(chuàng)建自定義鏡像。
基本結(jié)構(gòu)
Dockerfile主要分為四個部分:基礎(chǔ)鏡像信息庐椒、維護(hù)者信息宠漩、鏡像操作指令和容器啟動時執(zhí)行指令。
# 第一行指定基于的基礎(chǔ)鏡像
FROM ubuntu
# 維護(hù)者信息
MAINTAINER docker_user docker_user@email.com
# 鏡像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器啟動時執(zhí)行指令
CMD /usr/sbin/nginx
舉個例子:
下面的是mysql的官方構(gòu)建Dockerfile.
#
# MySQL Dockerfile
#
# https://github.com/dockerfile/mysql
#
# Pull base image.
FROM dockerfile/ubuntu
# Install MySQL.
RUN \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server && \
rm -rf /var/lib/apt/lists/* && \
sed -i 's/^\(bind-address\s.*\)/# \1/' /etc/mysql/my.cnf && \
sed -i 's/^\(log_error\s.*\)/# \1/' /etc/mysql/my.cnf && \
echo "mysqld_safe &" > /tmp/config && \
echo "mysqladmin --silent --wait=30 ping || exit 1" >> /tmp/config && \
echo "mysql -e 'GRANT ALL PRIVILEGES ON *.* TO \"root\"@\"%\" WITH GRANT OPTION;'" >> /tmp/config && \
bash /tmp/config && \
rm -f /tmp/config
# Define mountable directories.
VOLUME ["/etc/mysql", "/var/lib/mysql"]
# Define working directory.
WORKDIR /data
# Define default command.
CMD ["mysqld_safe"]
# Expose ports.
EXPOSE 3306
指令
FROM
格式為FROM <image>
或FROM<image>:<tag>
第一條指令必須為FROM
指令仗谆。MAINTAINER
格式為MAINTAINER<name>
指巡,指定維護(hù)者信息RUN
格式為RUN<command>或RUN["executable","param1"隶垮,"param2"]
藻雪。前者將在shell終端中運(yùn)行命令,即/bin/sh -c
狸吞;后者使用exec
執(zhí)行勉耀。CMD
支持三種格式:
CMD ["executable","param1","param2"] #使用exec執(zhí)行,推薦方式
CMD command param1 param2 #在/bin/sh 中執(zhí)行蹋偏,提供給需要交互的應(yīng)用
CMD ["param1","param2"] #提供給ENTRYPOINT的默認(rèn)參數(shù)
指定啟動容器的時候執(zhí)行的命令便斥,每個Dockerfile只能由一條CMD命令。如果制定了多條命令威始,只有最后一條會被執(zhí)行枢纠。
EXPOSE
格式為EXPOSE <port> [<port>...]
例如:
EXPOSE 22 80 8443
告訴Docker服務(wù)端容器暴露的端口號,供互聯(lián)系統(tǒng)使用黎棠。在啟動容器時需要通過-P
晋渺,Docker主機(jī)會自動分配一個端口轉(zhuǎn)發(fā)到指定端口;使用-p
脓斩,則可以具體指定哪個本地端口映射過來木西。ENV
格式為ENV <key> <value>
。指定一個環(huán)境變量随静,會被后續(xù)RUN指令使用八千,并在容器運(yùn)行時保持。
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress &&
ADD
格式為ADD <src> <dest>
該命令將復(fù)制指定的<src>到容器中的<dest>燎猛。其中<src>可以是Dockerfile所在目錄的一個相對路徑叼丑,也可以是一個URL,還可以是一個tar文件。COPY
格式為COPY <src> <dest>
復(fù)制本地主機(jī)的<src>(為Dockerfile所在目錄的相對路徑扛门,文件或目錄)為容器中的<dest>。目標(biāo)路徑不存在的時候會自動創(chuàng)建纵寝。
當(dāng)使用本地目錄作為源目錄時论寨,推薦使用COPY星立。ENTRYPOINT
有兩種方式:
ENTRYPOINT ["executable","param1"葬凳,"param2"]
ENTRYPOINT command param1 param2
每個Dockerfile中只能存在一個ENTRYPOINT
绰垂,當(dāng)指定多個ENTRYPOINT
時,只有最后一個生效火焰。
VOLUME
格式為VOLUME ["/data"]
創(chuàng)建一個可以從本地主機(jī)或者容器掛載的掛載點劲装,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)。USER
格式為USER daemon
指定運(yùn)行容器時的用戶名或者UID昌简,后續(xù)的RUN也會使用指定用戶占业。WORKDIR
格式為WORKDIR /path/to/workdir
為后續(xù)的RUN、CMD纯赎、ENTRYPOINT等指令配置工作目錄谦疾。ONBUILD
格式為ONBUILD [INSTRUCTION]
配置當(dāng)前所創(chuàng)建的鏡像作為其他新創(chuàng)建鏡像的基礎(chǔ)鏡像時所執(zhí)行的操作命令。例如犬金,Dockerfile使用如下內(nèi)容創(chuàng)建鏡像image-A
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]