M1 Monterey环境下无法启动Docker中的Flink JobManager容器
问题:M1 MacBook(Monterey系统)上Docker中Flink JobManager容器无法启动,无法创建工作目录
操作命令
使用的Flink容器启动命令:
docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ flink:1.16.0-scala_2.12 jobmanager
报错信息
容器启动失败,报错日志如下:
INFO org.apache.flink.runtime.entrypoint.ClusterEntrypoint [] - Shutting StandaloneSessionClusterEntrypoint down with application status FAILED. Diagnostics java.io.IOException: Could not create the working directory /tmp/jm_ba47b82cf8d85068faa1c41d30126b5d. at org.apache.flink.runtime.entrypoint.WorkingDirectory.createDirectory(WorkingDirectory.java:58) at org.apache.flink.runtime.entrypoint.WorkingDirectory.<init>(WorkingDirectory.java:39) at org.apache.flink.runtime.entrypoint.WorkingDirectory.create(WorkingDirectory.java:88) at org.apache.flink.runtime.entrypoint.ClusterEntrypointUtils.lambda$createJobManagerWorkingDirectory$2(ClusterEntrypointUtils.java:241) at org.apache.flink.runtime.entrypoint.DeterminismEnvelope.map(DeterminismEnvelope.java:49) at org.apache.flink.runtime.entrypoint.ClusterEntrypointUtils.createJobManagerWorkingDirectory(ClusterEntrypointUtils.java:239) at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.initializeServices(ClusterEntrypoint.java:356) at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.runCluster(ClusterEntrypoint.java:282) at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.lambda$startCluster$1(ClusterEntrypoint.java:232) at org.apache.flink.runtime.security.contexts.NoOpSecurityContext.runSecured(NoOpSecurityContext.java:28) at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.startCluster(ClusterEntrypoint.java:229) at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.runClusterEntrypoint(ClusterEntrypoint.java:729) at org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint.main(StandaloneSessionClusterEntrypoint.java:59)
Docker版本信息
Client: Cloud integration: v1.0.29 Version: 20.10.22 API version: 1.41 Go version: go1.18.9 Git commit: 3a2c30b Built: Thu Dec 15 22:28:41 2022 OS/Arch: darwin/arm64 Context: default Experimental: true
核心问题
为何容器无法创建所需的工作目录?
可能的原因及解决方法
镜像架构不兼容:Flink 1.16.0-scala_2.12官方镜像默认是amd64架构,M1的arm64架构通过Docker转译运行时,可能出现文件系统权限或兼容性问题。
解决:启动容器时指定arm64平台,命令修改为:docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ --platform linux/arm64 \ flink:1.16.0-scala_2.12 jobmanager或者选择官方支持arm64的Flink镜像版本(比如1.17及以后版本对arm支持更完善)。
容器内用户权限不足:Flink容器默认以非root用户运行,在创建/tmp下的工作目录时可能没有足够权限。
解决:临时以root用户启动容器测试:docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ --user root \ flink:1.16.0-scala_2.12 jobmanager若测试有效,可通过修改Flink配置指定自定义工作目录,或构建自定义镜像调整用户权限。
环境变量配置异常:命令中
${FLINK_PROPERTIES}未提前定义,空值传入干扰Flink配置,影响工作目录创建逻辑。
解决:先定义环境变量再启动,或直接移除该环境变量使用默认配置测试:docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ flink:1.16.0-scala_2.12 jobmanagerDocker临时目录挂载限制:Docker对容器内/tmp目录的挂载策略可能限制了子目录创建。
解决:显式挂载本地目录到容器/tmp:docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ -v /tmp/flink-jm:/tmp \ flink:1.16.0-scala_2.12 jobmanager注意提前在本地创建
/tmp/flink-jm目录并确保权限正确。
内容的提问来源于stack exchange,提问作者pippa dupree
相关产品推荐
相关产品推荐

