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 "$@"
文章转载自大数据启示录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




