dockerfile的指令:
FROM:
指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。
RUN:
用来执行命令行命令。其基本格式:
shell格式:
RUN <命令> ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN,
使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;
exec格式:
RUN <“可执行文件”, “参数1”, “参数2”>,此种方式像是函数调用中的格式;
COPY:
复制文件。 其基本格式:
格式1:COPY <源路径>…<目标路径>
格式2:COPY [“<源路径1>”,…"<目标路径>"]
ADD:
更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;
CMD:
容器启动命令。其基本格式:
shell格式: CMD <命令>
exec格式: CMD [“可执行文件”, “参数1”, “参数2”…]
参数列表格式: CMD [“参数1”, “参数2”…],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
ENTRYPOINT:
入口点。其基本格式分为exec和shell,
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker
run 的参数–entrypoint
来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:
“”
ENV:
设置环境变量。(都可以使用这里使用的变量)其基本格式:
格式1:ENV
格式2:ENV = =…
ARG:
构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:
格式1: ARG <参数名> [=<默认值>]
格式2: 该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖
VOLUME:
定义匿名卷。 其基本格式:
格式1: VOLUME ["<路径1>", “<路径2>”…]
格式2: VOLUME <路径>
EXPOSE:
暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:
格式1: EXPOSE <端口1> [<端口2>…]
WORKDIR:
指定工作目录。其基本格式:
格式1: WORKDIR <工作目录路径>
USER:
指定当前用户。USER是帮助你切换到指定用户。 其基本格式:
格式1: USER <用户名>
HEALTCHECK:
健康检查,判断容器的状态是否正常。 其基本格式:
格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健
Dockerfile打包nginx镜像
在Dockerfile本目录下创建entrypoint.sh # ls
data Dockerfile entrypoint.sh
# cat Dockefile
FROM centos:jc # 所用镜像
LABEL maintainer="name <***@***.com>"
ENV DOC_ROOT=/opt/data/html/ \
DATA_ROOT=/opt/data/ \
APP_ROOT=/opt/app/ \
LOGS_ROOT=/opt/logs/
COPY data/index.html ${DOC_ROOT}
ADD data/nginx-1.5.1.tar.gz $APP_ROOT
ADD entrypoint.sh ${DATA_ROOT}
EXPOSE 80/TCP
RUN yum -y install gcc automake autoconf libtool make gcc-c++ pcre-devel zlib-devel openssl-devel \
&& cd ${APP_ROOT}nginx-1.5.1 \
&& ./configure \
--prefix=${APP_ROOT}nginx/ \
--pid-path=${YUM_ROOT}nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=${LOGS_ROOT}nginx/error.log \
--http-log-path=${LOGS_ROOT}nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=${YUM_ROOT}nginx/client \
--http-proxy-temp-path=${YUM_ROOT}nginx/proxy \
--http-fastcgi-temp-path=${YUM_ROOT}nginx/fastcgi \
--http-uwsgi-temp-path=${YUM_ROOT}nginx/uwsgi \
--http-scgi-temp-path=${YUM_ROOT}nginx/scgi\
--with-http_ssl_module \
&& make install \
&& ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 \
&& ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 \
&& cd ${APP_ROOT} \
&& rm -rf nginx-1.5.1/
CMD [ "/opt/app/nginx/sbin/nginx","-g","daemon off;" ]
ENTRYPOINT [ "/opt/data/entrypoint.sh" ]
# cat entrypoint.sh
#!/bin/sh
#
cat > /opt/app/nginx/conf/nginx.conf << EOF
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /opt/app/nginx/conf.d/*.conf;
}
EOF
if [ ! -d /opt/app/nginx/conf.d ];then
mkdir /opt/app/nginx/conf.d
fi
cat > /opt/app/nginx/conf.d/test.conf << EOF
server {
listen ${PORT:-80};
server_name $HOSTNAME;
index index.shtml index.html index.php;
root ${DOC_ROOT:-/opt/data/html};
}
EOF
exec "$@"
# ls data/
index.html nginx-1.5.1.tar.gz yum.repos.d
# docker build -t nginx:v1 ./
开始打包镜像,-t 指定一个标签给打包出来的镜像,./ 就是Dockerfile所在