質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1524閲覧

DockerコンテナのGitサーバー(Smart HTTP)のhookからホストのDockerを操作したい

ta1g3n

総合スコア35

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2019/04/21 15:43

編集2019/04/22 13:30

前提・実現したいこと

Apache+Git(Smart HTTP)を導入したDockerコンテナにvolumeとして/var/run/docker.sockをマウントし、Git hookでmasterへのpush時にアップロードされたbuild.shに従ってDockerイメージを自動的にビルドするシステムを作っています。

発生している問題・エラーメッセージ

コンテナのシェルから直接build.shを実行する場合は普通にイメージのビルドが行われるのですが、git hookからbuild.shが実行された場合はDockerのソケットファイルのパーミッションが拒否されてしまいます。

$ git push origin master Username for 'http://localhost:8080': boke0 Password for 'http://boke0@localhost:8080': Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 264 bytes | 264.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=hoge%3Adev&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied To http://localhost:8080/git/hoge.git 4805741..dcfd059 master -> master

該当のソースコード

build.sh

bash

1#!/bin/bash 2 3if [ "$1"=="dev" ]; then 4 tag="dev" 5else 6 tag="1.0" 7fi 8docker build . -t hoge:$tag 9

post-receive

PHP

1#!/usr/bin/php -q 2<?php 3 4$git=explode("/",$_SERVER["REQUEST_URI"])[2]; 5$id=explode(".",$git)[0]; 6 7$ref=explode(" ",trim(fgets(STDIN)))[2]; 8if($ref=="refs/heads/master"){ 9 @exec("rm -Rf /var/www/resource/docker/{$id}"); 10 exec("git clone /var/www/resource/git/{$id}.git /var/www/resource/docker/{$id}"); 11 chmod("/var/www/resource/docker/{$id}/build.sh",0777); 12 chdir("/var/www/resource/docker/{$id}"); 13 exec("./build.sh"); 14}

コンテナ内のapacheユーザーとrootユーザーのメイングループはホストのDockerグループと同じIDのグループにしているのですが、何が原因でしょうか

2019年4月22日22時25分追記

apacheユーザーのシェルにbashで入ってDockerコマンドを実行したところ、パーミッションは拒否されず、実行できました。そこで、Git hookからidの実行結果を出力してみると以下のようになりました。

remote: uid=48(apache) gid=48(apache) groups=48(apache) remote: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/build?buildargs=%7B%7D&buildbinds=null&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=hoge%3Adev&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied

どうやら、Git hookのPHPのexecからコマンドを打つとdockerグループとして認識されていないようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

Apacheの実行グループがapacheに設定されていました。
/etc/httpd/conf/httpd.confを修正して解決しました。

投稿2019/04/23 08:39

ta1g3n

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

試していませんが、dockerコンテナにソケットをマウントするのではなくて、環境変数DOCKER_HOSTをtcp://host.docker.internal:2375とする、というのが一応解決策としてあるようです。

が、Dockerコンテナ内で docker コマンドを実行するのは、 DinD(Docker in Docker) となり、基本的には避けたほうがよいとされているらしいので、Kanikoを使うのが一般的っぽいですね。

投稿2019/04/22 00:59

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ta1g3n

2019/04/22 13:32

回答ありがとうございます。 host.docker.internalでホストにアクセスする方法はWindowsとMac以外のホストで提供されているのでしょうか。Ubuntuをホストマシンとしているのですが、実行したところhost.docker.internalは見つからなかったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問