【问题标题】:How do I execute commands on Karaf running inside Docker?如何在 Docker 内运行的 Karaf 上执行命令?
【发布时间】:2026-01-25 15:10:02
【问题描述】:

我正在一个 docker 容器中设置当前正在运行的 Apache karaf。我已使用以下代码创建 docker 映像。

FROM java:8-jdk
MAINTAINER mkroli
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV KARAF_VERSION=4.0.5

RUN wget http://apache.openmirror.de/karaf/${KARAF_VERSION}/apache-karaf-${KARAF_VERSION}.tar.gz; \
mkdir /opt/karaf; \
tar --strip-components=1 -C /opt/karaf -xzf apache-karaf-${KARAF_VERSION}.tar.gz; \
rm apache-karaf-${KARAF_VERSION}.tar.gz; \
mkdir /deploy; \
sed -i 's/^\(felix\.fileinstall\.dir\s*=\s*\).*$/\1\/deploy/' /opt/karaf/etc/org.apache.felix.fileinstall-deploy.cfg

VOLUME ["/deploy"]
EXPOSE 1099 8101 44444
ENTRYPOINT ["/opt/karaf/bin/karaf"]

我的 Docker 容器已启动并运行了 Karaf。一旦 Karaf 启动,我需要在 karaf 中运行基本命令(例如 feature:list, feature:install),以便我可以安装我的功能/捆绑包并列出它们。

  1. 我尝试在交互式 shell 中运行命令,但问题是我无法返回 docker shell,如果我返回 Karaf 容器会停止。

那么如何在 Docker 内运行的 Karaf 上执行命令呢?

【问题讨论】:

  • 您尝试docker exec -it container_id bash 然后启动您的命令了吗?文档docs.docker.com/engine/reference/commandline/exec
  • 请记住,docker run Karaf bash 会启动一个新容器,它不会进入您正在运行的 Karaf 容器
  • 如果我通过 exec 或 run 这样做,我可以进入 karaf shell,但是如果我尝试进入 docker shell,我需要注销(这会停止 Karaf 服务器)并且句柄会进入 docker 容器。

标签: docker apache-karaf


【解决方案1】:

更改您的 dockerfile 并添加以下内容

ENTRYPOINT ["/opt/apache/karaf/bin/start"]

【讨论】:

    【解决方案2】:

    ssh 到你的 docker-Karaf Image 并从那里发出 shell 命令怎么样?但请确保您有用于 ssh 导出的端口:

    EXPOSE 8081
    

    【讨论】:

      【解决方案3】:

      您应该从您的主机访问 karaf 8101 是容器内使用的端口。 试试这个命令以交互模式运行容器

      docker run -it -p 8101:8080 mkroli/karaf 
      

      您可以使用 -d 选项在后台运行此容器。

      【讨论】:

        【解决方案4】:

        在 Jean-Baptiste Onofré 的博客文章 Apache Karaf & Docker 中,他展示了如何在 Docker 容器中设置和运行 Apache Karaf

        使用his build.sh script 创建一个容器,方法如下:

        build.sh --from-release --karaf-version 4.2.7 --image-name karaf
        

        然后,您可以在容器中运行 Karaf 控制台:

        docker-compose run karaf
        

        瞧! :)

        【讨论】: