dockerfile 详解

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: dockerfile 详解

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 "$@"
相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
4天前
|
Java Linux 开发工具
|
4天前
|
Ubuntu Shell Docker
Dockerfile
Dockerfile 可以通过以下步骤进行: 1. 了解 Dockerfile 的基本概念:Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了构建 Docker 镜像所需的指令。了解 Dockerfile 的基本概念有助于更好地理解 Dockerfile 的作用和用途。
33 2
|
5月前
|
缓存 Shell Go
dockerfile介绍与使用
dockerfile介绍与使用
64 1
|
8月前
|
缓存 Shell C语言
Dockerfile完全指南
Dockerfile完全指南
165 2
|
9月前
|
Linux 应用服务中间件 开发工具
dockerfile
dockerfile
75 0
|
10月前
|
Java Shell Linux
41-Dockerfile-Dockerfile简介
41-Dockerfile-Dockerfile简介
|
10月前
|
Go 容器
一文了解 Dockerfile 鲜为人知的一面
Hello folks,今天给大家介绍一下如何在 Dockerfile 中进行 Go 代码编写及运用(备注:此处暂不关注所部署的容器大小及性能问题)。
71 0
|
10月前
|
缓存 Shell Go
DockerFile文件详解
DockerFile文件详解
158 0
|
12月前
|
应用服务中间件 Shell nginx
|
Ubuntu Shell 开发工具
DockerFile
DockerFile
62 0