首页 > 解决方案 > Docker 上带有 Alpine Linux 的 Apache git 服务器

问题描述

我正在尝试通过http在 Docker 中使用 Alpine 的 Apache 映像来提供 git repos。

我能够让 Apache 提供文档和文件夹http(此文件夹中有一些非 git 存储库,目前这只是一个概念证明,因此可以忽略它们):

docker alpine apache git

但是,当我尝试克隆 git repo 时,我只能成功克隆DynamicDockerTesting.gitrepo。当试图克隆其他回购时,我得到

fatal: repository 'http://192.168.1.32/<repo-name>.git' not found

我已经检查了我能想到的DynamicDockerTesting.git与其他 repo 之间的每一个差异,但还没有找到任何有意义的差异来解释为什么我可以克隆那个特定的 repo,但没有其他的。如果您有关于如何弄清楚为什么会这样的建议,我很想听听他们的意见,但更重要的是,如果您知道我通常做错了什么,以及如何使用 docker-alpine-apache 成功部署这些 repo -git 组合,我将不胜感激。

以下是我的内容Dockerfile

FROM httpd:alpine 

RUN mkdir -p /usr/local/apache2/git
RUN apk update && apk upgrade && apk add git git-gitweb apache2-utils apache2
COPY apacheGitServer.xml  /usr/local/apache2/
RUN cat /usr/local/apache2/apacheGitServer.xml >> /usr/local/apache2/conf/httpd.conf
RUN sed -i '/LoadModule alias_module modules\/mod_alias.so/aLoadModule cgi_module modules/mod_cgi.so' /usr/local/apache2/conf/httpd.conf

Alpine Apache 似乎运行了所有东西/usr/local/apache2(而不是/etc/apache2),所以在这里我只是添加到默认httpd.conf的逻辑来部署 repos,并启用cgi模块,因为它默认是禁用的(env并且默认alias是启用的)。

以下是内容apacheGitServer.xml

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /usr/local/apache2/git/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/git
    ServerName 192.168.1.32

    <Directory "/usr/local/apache2/git">
        Allow from All
        Options +Indexes +ExecCGI
        AllowOverride All
        AddHandler cgi-script cgi
    </Directory>

    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv GIT_PROJECT_ROOT /usr/local/apache2/git
    ScriptAlias /git/ /usr/libexec/git-core/git-http-backend
    #ScriptAlias / /usr/share/gitweb/gitweb.cgi
</VirtualHost>

apacheGitServer.xml经历了多次修改,因为我尝试了所有我能想到的配置,但无济于事。此配置使存储库可访问,但不可克隆(当然,除外DynamicDockerTesting.git

使用DockerfileandapacheGitServer.xml在同一个文件夹中,我一直在构建图像

docker build -t apachegit .

然后我cd用我的 git repo 'ed 到目录,并发出命令

docker run -d --name apachegitserver -p 80:80 -v $(pwd):/usr/local/apache2/git apachegit

我花了两天时间试图让这个工作,所以在这一点上任何指导都是受欢迎的。

编辑

容器内的顶部命令

运行时,top我看到该进程由 拥有daemon,我已经cd/usr/local/apache2/git容器内部运行并运行chown -R daemon:daemon .,但是现在当我克隆时:

git clone http://192.168.1.32/git/ScalaOpenCV.git

我得到一个403

fatal: unable to access 'http://192.168.1.32/git/<repo name>.git/': The requested URL returned error: 403

(实际上,403无论我是否更改权限,我都会得到一个)

标签: gitapachedockeralpinegitweb

解决方案


ScriptAlias /git/ /usr/libexec/git-core/git-http-backend

这意味着任何 git 操作都应该包含一个 URL /git/(如本设置所示)。

git clone http://192.168.1.32/git/<repo-name>.git

检查 apache 日志以查看与其他日志之间是否有任何区别 DynamicDockerTesting.git。检查所有权,如此处所示


推荐阅读