You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Heroku上Docker部署Kartoza Geoserver遇权限错误求助

在Heroku上部署Kartoza GeoServer解决"groupadd: cannot open /etc/group"错误的方案

我是Docker新手,非IT专业,尝试在Heroku上用Docker部署Kartoza GeoServer一直失败,启动时日志总是报错:

"Error: groupadd: cannot open /etc/group"

推测是权限/特权问题,已经做了这些修改但没用:

  • 移除了Dockerfile中的端口转发配置
  • 添加了RUN adduser -D myuser和USER myuser指令

问题根源

Heroku的容器运行环境中,/etc目录是只读的,而且你之前的Dockerfile错误地在执行需要root权限的安装操作前就切换到了普通用户,导致后续操作权限不足,同时启动脚本里可能有尝试修改/etc/group的操作,触发了只读限制。

具体修改方案

1. 调整用户切换时机

把创建用户和切换用户的步骤放到所有安装、配置操作的最后,确保root权限完成所有需要修改系统的操作。

2. 给普通用户分配必要权限

在切换用户前,给myuser分配GeoServer运行所需目录的读写权限,避免启动时权限不足。

3. 修改后的Dockerfile

#--------- Generic stuff all our Dockerfiles should start with so we get caching ------------
ARG IMAGE_VERSION=9.0.65-jdk11-openjdk-slim-buster
ARG JAVA_HOME=/usr/local/openjdk-11
FROM tomcat:$IMAGE_VERSION

LABEL maintainer="Tim Sutton<tim@linfiniti.com>"
ARG GS_VERSION=2.22.0
ARG WAR_URL=https://downloads.sourceforge.net/project/geoserver/GeoServer/${GS_VERSION}/geoserver-${GS_VERSION}-war.zip
ARG STABLE_PLUGIN_BASE_URL=https://sourceforge.net/projects/geoserver/files/GeoServer
ARG DOWNLOAD_ALL_STABLE_EXTENSIONS=1
ARG DOWNLOAD_ALL_COMMUNITY_EXTENSIONS=1
ARG HTTPS_PORT=8443
ENV DEBIAN_FRONTEND=noninteractive
#Install extra fonts to use with sld font markers

# 先以root完成所有安装和配置操作
RUN set -eux; \
    apt-get update; \
    apt-get -y --no-install-recommends install \
        locales gnupg2 wget ca-certificates rpl pwgen software-properties-common  iputils-ping \
        apt-transport-https curl gettext fonts-cantarell lmodern ttf-aenigma \
        ttf-bitstream-vera ttf-sjfonts tv-fonts  libapr1-dev libssl-dev  \
        wget zip unzip curl xsltproc certbot  cabextract gettext postgresql-client figlet gosu gdal-bin; \
    # Install gdal3 - bullseye doesn't build libgdal-java anymore so we can't upgrade
    curl https://deb.meteo.guru/velivole-keyring.asc |  apt-key add - \
    && echo "deb https://deb.meteo.guru/debian buster main" > /etc/apt/sources.list.d/meteo.guru.list \
    && apt-get update \
    && apt-get -y --no-install-recommends install gdal-bin libgdal-java; \
    dpkg-divert --local --rename --add /sbin/initctl \
    && (echo "Yes, do as I say!" | apt-get remove --force-yes login) \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*; \
    # verify that the binary works
    gosu nobody true

ENV \
    JAVA_HOME=${JAVA_HOME} \
    DEBIAN_FRONTEND=noninteractive \
    GEOSERVER_DATA_DIR=/opt/geoserver/data_dir \
    GDAL_DATA=/usr/share/gdal \
    LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/tomcat/native-jni-lib:/usr/lib/jni:/usr/local/apr/lib:/opt/libjpeg-turbo/lib64:/usr/lib:/usr/lib/x86_64-linux-gnu" \
    FOOTPRINTS_DATA_DIR=/opt/footprints_dir \
    GEOWEBCACHE_CACHE_DIR=/opt/geoserver/data_dir/gwc \
    CERT_DIR=/etc/certs \
    RANDFILE=/etc/certs/.rnd \
    FONTS_DIR=/opt/fonts \
    GEOSERVER_HOME=/geoserver \
    EXTRA_CONFIG_DIR=/settings \
    COMMUNITY_PLUGINS_DIR=/community_plugins  \
    STABLE_PLUGINS_DIR=/stable_plugins


WORKDIR /scripts
ADD resources /tmp/resources
ADD build_data /build_data
ADD scripts /scripts

RUN echo $GS_VERSION > /scripts/geoserver_version.txt ;\
    chmod +x /scripts/*.sh;/scripts/setup.sh \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 创建普通用户并分配权限
RUN adduser -D myuser \
    # 给myuser分配GeoServer相关目录的权限
    && chown -R myuser:myuser /opt/geoserver /usr/local/tomcat /scripts /settings /community_plugins /stable_plugins /etc/certs

# 最后切换到普通用户
USER myuser

RUN echo 'figlet -t "Kartoza Docker GeoServer"' >> ~/.bashrc

WORKDIR ${GEOSERVER_HOME}

ENTRYPOINT ["/bin/bash", "/scripts/entrypoint.sh"]

4. 关键修改点说明

  • 移除了原来过早的RUN adduser和USER指令,放到所有安装步骤之后
  • 添加了chown -R myuser:myuser ...命令,确保普通用户拥有所有运行所需目录的读写权限
  • 保持root权限完成系统级安装,避免权限不足的问题

部署步骤

  1. 构建镜像(适配Heroku的amd64架构):
docker build --platform linux/amd64 -t heroku-geoserver .
  1. 标记镜像并推送到Heroku容器注册表:
# 登录Heroku容器注册表
heroku container:login
# 标记镜像
docker tag heroku-geoserver registry.heroku.com/你的应用名称/web
# 推送镜像
docker push registry.heroku.com/你的应用名称/web
  1. 启动容器:
heroku container:release web -a 你的应用名称

额外注意事项

  • Heroku的容器不支持自定义端口转发,会自动把容器的端口映射到外部的443/80端口,所以不需要在Dockerfile里暴露端口
  • 如果entrypoint脚本里有尝试修改/etc目录的操作,需要修改脚本跳过相关步骤,或者在构建阶段提前完成配置

内容的提问来源于stack exchange,提问作者Edmond Muller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:16:47