在Dockerfile中设置项目目录为Entrypoint的工作目录
解决Dockerfile设置带参数bash脚本为入口点的问题
你的需求核心是让带参数的bash脚本作为容器启动的入口,同时把项目目录设为工作目录,我帮你调整Dockerfile并解决几个关键细节问题:
关键修改点说明
- 原
ENTRYPOINT的写法不符合Docker最佳实践:直接写runDemo.sh $SPARK_MASTER会让shell提前解析参数,无法正确处理用户后续传递的命令行参数。我们改用exec格式的ENTRYPOINT固定脚本,用CMD传递默认参数,这样用户启动容器时还能灵活覆盖参数。 - 必须保证脚本的可执行权限:如果是把脚本打包进镜像,需要添加
chmod命令;如果是通过挂载宿主机目录进来,也要确保宿主机上脚本有可执行权限。 - 工作目录已设为
/Demo,但要确保你的项目文件夹挂载到这个路径时,runDemo.sh确实在/Demo目录下。
修改后的完整Dockerfile
FROM java:8 ENV SCALA_VERSION 2.11.8 ENV SBT_VERSION 1.1.1 ENV SPARK_VERSION 2.2.0 ENV SPARK_DIST spark-$SPARK_VERSION-bin-hadoop2.6 ENV SPARK_ARCH $SPARK_DIST.tgz ARG SPARK_MASTER WORKDIR /opt # Install Scala RUN \ cd /root && \ curl -o scala-$SCALA_VERSION.tgz http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz && \ tar -xf scala-$SCALA_VERSION.tgz && \ rm scala-$SCALA_VERSION.tgz && \ # 改用ENV设置PATH,避免依赖bashrc生效问题 ENV PATH ~/scala-$SCALA_VERSION/bin:$PATH # Install SBT RUN \ curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ dpkg -i sbt-$SBT_VERSION.deb && \ rm sbt-$SBT_VERSION.deb # Install Spark RUN \ cd /opt && \ curl -o $SPARK_ARCH http://d3kbcqa49mib13.cloudfront.net/$SPARK_ARCH && \ tar xvfz $SPARK_ARCH && \ rm $SPARK_ARCH && \ # 同样用ENV全局设置Spark路径 ENV PATH $SPARK_DIST/bin:$PATH EXPOSE 9851 9852 4040 9092 9200 9300 5601 7474 7687 7473 # 设置项目目录为工作目录 WORKDIR /Demo # 如果runDemo.sh是打包进镜像的,取消下面两行注释(复制脚本并赋予可执行权限) # COPY runDemo.sh . # RUN chmod +x runDemo.sh # 用exec格式ENTRYPOINT固定脚本,CMD传递默认的SPARK_MASTER参数 ENTRYPOINT ["bash", "./runDemo.sh"] CMD ["$SPARK_MASTER"]
使用补充说明
- 参数覆盖:如果启动容器时想自定义
SPARK_MASTER参数,直接在docker run命令后追加即可,比如:docker run -v /你的本地项目路径:/Demo 你的镜像名 custom-spark-master-url - 环境变量优化:原Dockerfile把路径写到
/root/.bashrc,但容器启动时如果不是bash登录shell,环境变量可能不生效。修改后改用ENV全局设置,确保spark、scala等命令在脚本中直接可用。
内容的提问来源于stack exchange,提问作者Cassie
相关产品推荐
相关产品推荐

