Dockerfile常用命令
- FROM: 继承基础镜像
- MAINTAINER:镜像制作作者信息
- RUN: 用来执行shell命令
- EXPOSE: 暴露端口号
- CMD: 启动容器默认执行的命令,会被覆盖
- ENTRYPOINT: 启动容器真正执行的命令,不会被覆盖
- VOLUME:创建该挂载点
- ENV: 配置环境变量
- ADD: 复制文件到容器,一般拷贝文件,压缩包自动解压
- COPY:复制文件到容器,一般可拷贝目录
- WORKDIR:设置容器的工作目录
- USER:容器使用的用户
接下来,列举几个Dockerfile的实例。
Dockerfile实例
1.使用RUN创建一个用户
Dockerfile文件内容如下所示。
FROM centos:6 MAINTAINER binghe RUN useradd binghe
执行构建,如下所示。
docker build -t centos:user .
2.使用ENV定义环境变量并用CMD执行命令
Dockerfile文件内容如下所示。
FROM centos:6 MAINTAINER binghe RUN useradd binghe RUN mkdir binghe ENV envir=test version=1.0 CMD echo "envir:$envir version:$version"
执行构建并启动测试:
#执行构建 docker build -t centos:evn-cmd . #启动镜像验证EVN和CMD docker run centos:env-cmd
3.使用ADD添加一个压缩包,使用WORKDIR改变工作目录
FROM nginx MAINTAINER binghe ADD ./index.tar.gz /usr/share/nginx/html/ WORKDIR /usr/share/nginx/html
4.使用COPY拷贝目录
使用COPY拷贝指定目录下的所有文件到容器,不包括本级目录。此时只会拷贝webroot下的所有文件,不会将webroot拷贝过去:
FROM nginx MAINTAINER binghe ADD ./index.tar.gz /usr/share/nginx/html/ WORKDIR /usr/share/nginx/html COPY webroot/ .
5.设置启动容器的用户
设置启动容器的用户,在生产环境中一般不建议使用root用户启动容器,所以,可以根据公司业务场景自定义启动容器的用户:
FROM centos:6 MAINTAINER binghe ADD ./index.tar.gz /usr/share/nginx/html/ WORKDIR /usr/share/nginx/html COPY webroot/ . RUN useradd -m tomcat -u 1001 USER 1001
6.使用VOLUME创建容器可挂载点
FROM centos:6 MAINTAINER binghe VOLUME /data
挂载目录到/data,注意:对于宿主机路径,要写绝对路径:
docker run -ti --rm -v `pwd` /web:/data centos:volume bash
Dockerfile完整demo
FROM centos:7 MAINTAINER pkk # 安装需要的软件 # snappy 是一个压缩库 # libc6-compat 是 ANSI C 的函数库 RUN apk add --no-cache bash snappy libc6-compat # Flink 容器里的环境变量 # Flink 软件的安装目录在 /opt ENV FLINK_INSTALL_PATH=/opt # Flikn 的解压目录在 /opt/flink ENV FLINK_HOME $FLINK_INSTALL_PATH/flink # Flink 的依赖包目录在 /opt/flink/lib ENV FLINK_LIB_DIR $FLINK_HOME/lib # Flink 的插件目录在 /opt/flink/plugins ENV FLINK_PLUGINS_DIR $FLINK_HOME/plugins # 这个不知道是什么目录 ENV FLINK_OPT_DIR $FLINK_HOME/opt # 这是用户代码的 Jar 包目录,/opt/flink/artifacts ENV FLINK_JOB_ARTIFACTS_DIR $FLINK_INSTALL_PATH/artifacts # 更新一下 PATH,把 Flink 的二进制文件的目录加上 /opt/flink/bin ENV PATH $PATH:$FLINK_HOME/bin # 这些 ARG 可以在构建镜像的时候输入参数,默认值都是 NOT_SET,如果设置了就会去找对应的目录,并且打入镜像里 # Flink 的发行版路径,可以在本地指定任何下载或者自行打包的 Flink 发行版包 ARG flink_dist=NOT_SET # 用户写的业务代码路径 ARG job_artifacts=NOT_SET # Python 的版本,填2或者3 ARG python_version=NOT_SET # Hadoop Jar 包的依赖路径 ARG hadoop_jar=NOT_SET* # 安装 Python,根据前面填的 python_version 这个环境变量,不填就不装 RUN \ if [ "$python_version" = "2" ]; then \ apk add --no-cache python; \ elif [ "$python_version" = "3" ]; then \ apk add --no-cache python3 && ln -s /usr/bin/python3 /usr/bin/python; \ fi # 把 Flink 发行版和 Hadoop jar(不一定有 Hadoop)放在 /opt/flink 目录 ADD $flink_dist $hadoop_jar $FLINK_INSTALL_PATH/ # 用户代码放在 /opt/artifacts ADD $job_artifacts/* $FLINK_JOB_ARTIFACTS_DIR/ RUN set -x && \ ln -s $FLINK_INSTALL_PATH/flink-[0-9]* $FLINK_HOME && \ for jar in $FLINK_JOB_ARTIFACTS_DIR/*.jar; do [ -f "$jar" ] || continue; ln -s $jar $FLINK_LIB_DIR; done && \ if [ -n "$python_version" ]; then ln -s $FLINK_OPT_DIR/flink-python-*-java-binding.jar $FLINK_LIB_DIR; fi && \ if [ -f ${FLINK_INSTALL_PATH}/flink-shaded-hadoop* ]; then ln -s ${FLINK_INSTALL_PATH}/flink-shaded-hadoop* $FLINK_LIB_DIR; fi && \ # 创建 flink 用户组和 flink 用户,并且更改下面目录的用户权限 addgroup -S flink && adduser -D -S -H -G flink -h $FLINK_HOME flink && \ chown -R flink:flink ${FLINK_INSTALL_PATH}/flink-* && \ chown -R flink:flink ${FLINK_JOB_ARTIFACTS_DIR}/ && \ chown -h flink:flink $FLINK_HOME # 把这个脚本拷贝到镜像 COPY docker-entrypoint.sh / # 切换用户 flink USER flink # 暴露 8081 和 6123 端口 EXPOSE 8081 6123 # 指定容器启动脚本 ENTRYPOINT ["/docker-entrypoint.sh"] # docker run 可以传入 -help 参数 CMD ["--help"]
docker-entrypoint.sh
# 指定 Flink 的目录 FLINK_HOME=${FLINK_HOME:-"/opt/flink/bin"} # 这两个变量分别用于启动 jc 和 tm JOB_CLUSTER="job-cluster" TASK_MANAGER="task-manager" CMD="$1" shift; if [ "${CMD}" == "--help" -o "${CMD}" == "-h" ]; then echo "Usage: $(basename $0) (${JOB_CLUSTER}|${TASK_MANAGER})" exit 0 elif [ "${CMD}" == "${JOB_CLUSTER}" -o "${CMD}" == "${TASK_MANAGER}" ]; then echo "Starting the ${CMD}" if [ "${CMD}" == "${TASK_MANAGER}" ]; then # 启动 taskmanager exec $FLINK_HOME/bin/taskmanager.sh start-foreground "$@" else # 启动 standalone-job exec $FLINK_HOME/bin/standalone-job.sh start-foreground "$@" fi fi exec "$@"