Docker:如何在ArangoDB镜像中运行双命令,其中arangod依赖ENTRYPOINT?
为ArangoDB镜像启用Cron功能的正确实现
你的配置执行失败的原因是:CMD ["arangod", "/usr/sbin/crond -f"]会把/usr/sbin/crond -f当作arangod的参数传递给ENTRYPOINT脚本,而arangod会将其识别为数据库目录路径,自然无法正常启动。
要同时运行crond和arangod(依赖原ENTRYPOINT脚本),可以采用以下两种可靠方案:
方案一:修改原ENTRYPOINT脚本
原镜像的/entrypoint.sh负责初始化环境并启动arangod,我们可以在其中加入启动crond的逻辑:
- 编写修改后的
entrypoint.sh(基于原镜像脚本):
#!/bin/sh # ... 保留原entrypoint.sh的所有初始化逻辑 ... # 后台启动crond(-b参数让crond在后台运行,不阻塞后续流程) /usr/sbin/crond -b # 执行原启动命令(即CMD传递的参数,默认是arangod) exec "$@"
- 编写Dockerfile:
FROM arangodb:3.10.3 # 若镜像未预装cron,执行安装(alpine基础镜像通常已包含crond,可根据实际情况调整) RUN apk add --no-cache cron # 替换原entrypoint脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh EXPOSE 8529 CMD ["arangod"]
方案二:新增启动脚本,通过ENTRYPOINT间接调用
无需修改原entrypoint脚本,新增一个启动脚本协调crond和arangod的启动:
- 编写
start.sh启动脚本:
#!/bin/sh # 后台启动crond /usr/sbin/crond -b # 调用原启动命令(继承ENTRYPOINT的参数传递逻辑) exec "$@"
- 编写Dockerfile:
FROM arangodb:3.10.3 RUN apk add --no-cache cron # 添加启动脚本 COPY start.sh /start.sh RUN chmod +x /start.sh EXPOSE 8529 # 让ENTRYPOINT调用start.sh,再传递arangod命令 CMD ["/start.sh", "arangod"]
两种方案的核心逻辑都是:让crond在后台运行,同时保证arangod在前台运行(容器需要一个前台进程才能保持存活)。
内容的提问来源于stack exchange,提问作者Bogdan Timofeev
相关产品推荐
相关产品推荐

