カテゴリー別アーカイブ: docker

jenkins pipeline内のpostgresにてDBダンプ取得

環境

CentOS Linux release 7.5.1804 (Core) DockerのHostマシン
Jenkins 2.138.1
Docker Commons Plugin
Docker Pipeline
postgres 11(公式のdocker-image latest)

やりたかったこと

他のDBサーバからデータを持って来てダンプファイルを作りたかった。

動いたJenkinsfile設定

.pgpassを任意のパス(ここではhostの/ci/app/hoge)に置き、そのパスをvオプションでマウント、さらにマウントしたファイル(ここでは/root/.pgpass)をeオプションで指定。

    
pipeline {
  agent none
  stages{
    stage('DBコピーフェーズ') {
      agent {
        docker {
          image 'postgres'
          args '-v /ci/app/hoge:/root -e PGPASSFILE=/root/.pgpass'
        }
      }
  
      steps {
        sh 'pg_dump -h ホスト名 -p 5432 -U ユーザ名 DB名 > /root/test.sql'
        sh 'echo DBコピー'
      }
    }
  }
}

動かなかった設定

.pgpassを任意のパス(ここではhostの/ci/app/hoge)に置き、そのパスをホームディレクトリとして環境変数で指定。

args '-v /ci/app/hoge:/home/ciuser -e HOME=/home/ciuser'

postgresコンテナ内の環境変数にはHOMEが反映されているが.pgpassは読み込まれなかった。
多分
getpwuidで実行ユーザ(uid1000)で環境変数ではなく/etc/passwdからホームを取得しようとする
postgresコンテナにはuid1000のユーザはいないからホームディレクトリが取得できない(echoしてみたら/で表示されてはいた)
/には.pgpassが無いからエラー
という流れと思うが調査は途中でやめた。

awscliを使えるJenkinsの(Docker)agent

Jenkinsのpipelineからawscliを使えるエージェントを呼び出して使おうと思ったら結構てまどったのでそのメモ。

環境

その時の最新

CentOS Linux release 7.5.1804 (Core) DockerのHostマシン
Jenkins 2.138.1
Pipeline 2.5
Pipeline: SCM Step 2.6
Git plugin 3.9.1
docker-machine version 0.11.0, build 5b27455
DOCKER v18.06.1-ce

awscliの入ったイメージ

こちら
dockerfileにあるユーザ名は任意で良いけれども、uid/gidはDockerのユーザが基本的に1000なので1000にあわせておかないとややこしい。

Jenkinsfile

pipeline {
	agent none
    
	stages{
		stage('コピーフェーズ') {
			agent {
				docker {
			  		image 'kyoshitake/awscli'
             		args '-v /path/to/.awsconfの親:/home/ciuser:rw -e HOME=/home/ciuser'
             	}
			}
			
			steps {
				sh 'echo コピーフェーズ'
				sh 'aws s3 ls lwo > /home/ciuser/hoge.txt'
				sh 'echo 試験でls'
			}
		}
    }
}

agentに作ったイメージを指定。

hostにawsの認証ファイルを配置しておき、認証情報ファイルのあるディレクトリ(.aws)の親ディレクトリをマウント(/home/hoge/.awsとあるとすると/home/hogeをマウント)。なお、環境変数等で指定してもOKのはずだが試してはいない。

ハマリポイントとしてjenkinsのagentとして動かす場合は明示的にホームディレクトリを(環境変数で)指定しないと”/”がホームディレクトリになった。
明示的にホームを指定するのでawscliのイメージで指定したユーザの/home/ciuserに拘らず任意の名前でOKのはず。(なのでawscliのユーザ名と一致させる必要もないはず。)

Jenkins

Docker-compose

version: '3'
services:
jenkins:
build: ./jenkins
restart: always
container_name: jenkins
environment:
VIRTUAL_HOST: hoge.huga.co.jp
VIRTUAL_PORT: 8080
LETSENCRYPT_HOST: hoge.huga.co.jp
LETSENCRYPT_EMAIL: kitamura@epea.co.jp
volumes:
- jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
- /ci:/ci:ro
networks:
- default
- proxy_default

data:
image: busybox
volumes:
- jenkins_data:/var/jenkins_home

volumes:
jenkins_data:

volumesにある/var/run/docker.sock:/var/run/docker.sockでJenkinsイメージのhostにあるDockerを使用。
/ci:/ci:roはjenkinsが読み込みたいファイル類の置き場(このブログだと関係ないはず)

dockerhubにあるnginx-proxyとletsencrypt-nginx-proxy-companionでssl化していてnetworksにあるproxy_defaultはそちらのネットワーク。

取消線入れてあるところは、多分無くても動くはずの今回のブログでは必須では無い物。(だが、自分の環境ではそれでやっていて最低限の設定は確認していないのでのせておく。)

Dockerfile

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get update && apt-get install -y docker-ce

ARG DOCKER_GID=991
RUN groupmod -g ${DOCKER_GID} docker && adduser jenkins docker

RUN mkdir -p /ci

USER jenkins

公式のJenkinsイメージにdockerをインストールしたもの。

gidはhostのJenkinsユーザに合わせたもの。多分docker-machineでいれたら991になっていると思うが、各自で要確認。

 

 

DockerHubでの自動ビルドが複数回走ってしまう(未解決)

理由)
BitBucketのレポジトリへのpushをトリガーにDockerHubでイメージを自動ビルドする際に、Bitbucketで各Dockerfileで個別にレポジトリを持ちたくなかった。

結果)
ビルドが複数回走ってうまくいかない

内容)
一つのBitbucket側のレポジトリに複数のDockerfileをディレクトリを分て管理。そして、Bitbhcket側でDockerfileのあるパスを指定しビルドをする形態をとりたかった。現時点では、イメージできはするけど一回のpushでビルドが複数回走ってしまう。

Bitbucket側はこんな感じ
https://bitbucket.org/YoshitakeKitamura/dockerfiles/src/master/

DockerhubではレポジトリとDockerfileのパスを指定

git add --all
git commit -m test
git push

で複数ビルドが走っている。

ビルド回数は1+dockerfileの数回?(mavenというdockerfileのディレクトリとawscliというものがある)

 

これからシンプルに1イメージ1レポジトリを試してみるけど、これだとやっぱり発生するかも
1イメージ1レポジトリは動いた。

dockerで起動したdnsmasqとvagrant(libvirtd)のdnsmasqがport競合

dockerでdnsmasqを手軽に起動しようとしたら53番がすでにうまっていた。
なにで使っていたっけとみてみるとvagrant(libvirtd)が内部で使用する用のdnsmasqがすでに立ち上がっていた。

ググってみたところhostで直接dnsmasqを立てているときの解決法はでてきた。

起動準を気にしないでお異様にlibvirt側の設定からリッスン(バインド?)するのを絞って(+docker側でも絞って)競合しないようにしたいけど、上の解決策が公式にあるってことは、libvirtの設定でlibvirtのdnsmasqをいじるのは難しいのかな?libvirtのdnsmasq.confは自動生成だから直接これを変わっていいものでもなさそうだし。

最近はdockerばっかでvagrant触ることもほとんどないのでとりあえず止めとくか。。。

ownCloudの設定(docker-compose+cifs/netshare) 失敗

※こちらは(多分)NASの権限設定周りの問題でうまく動きませんでした。

dockerのcifsボリュームマウントはできたのでdocker-composeにてownCloudの設定。

データディレクトリはボリュームプラグインでマウントしているNAS(Cifs)

ownCloudの前面にnginx-proxyとjrcs/letsencrypt-nginx-proxy-companionを使ってSSL化しているのでそちらがらみの設定もあり。(青字部分)

/var/www/html/dataのパーミッションがおかしくなっていたので確認中。
->別件のトラブル起きたので後回し(飲みながらやってたら、NASマウントしたままrm -rfをしてしまった。。。)

docker-volume-netshareを起動するときにuid,gidは指定しないといけなかった。また、NAS側のユーザがパーミッション与えておかないといけない(よう)だが、NASの設定があまりうまくいかないのでownCloudのデータボリュームとして使うのはあきらめた。
(ownCloud初回アクセス時に、パーミッションとオーナーを書き換える処理が走るが、既存のNAS設定と共有してうまく走らせるのは厳しかった)

 


version: ‘3.1’

services:

owncloud:
image: owncloud
restart: always
ports:
– 80
environment:
      VIRTUAL_HOST: ホスト名
      LETSENCRYPT_HOST: ホスト名
      LETSENCRYPT_EMAIL: Lets’sEncliptの連絡先
networks:
– default
      – mydcproxy_default
volumes:
– nasvolume:/var/www/html/data

mysql:
image: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: パスワード
networks:
– default

volumes:
nasvolume:
driver: cifs
driver_opts:
share: 192.168.1.n/path
domain: ドメイン名
dirMode: 770
fileMode: 660

networks:
  mydcproxy_default:
    external: true

CentOS7にdockerのnetshareプラグイン設定(CIFS)

CentOS7上で動かしているdocker(ownCloud)でボリュームにNASを使いたいのでcifsを使えるというnetshareプラグインを設定してみる。

公式によるとDebian/Ubuntu以外はバイナリ入れるかgoでコンパイルしろとのこと。

コンパイルしようとしたらgo getの段階でおこられた。

go get github.com/ContainX/docker-volume-netshare
# github.com/ContainX/docker-volume-netshare/netshare/drivers
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/ceph.go:44: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/ceph.go:68: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/cifs.go:76: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/cifs.go:128: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:23: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:23: undefined: volume.Request
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:47: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:47: undefined: volume.Request
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:61: undefined: volume.Response
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:61: undefined: volume.Request
../../../go/src/github.com/ContainX/docker-volume-netshare/netshare/drivers/driver.go:61: too many errors

リファクタリング派手にしてこわれているまま?こちら
数日後にフォークして修正したと同じスレッドに書き込まれていた。(自分では未コンパイル)

バイナリをダウンロードすることに変更

wget https://github.com/ContainX/docker-volume-netshare/releases/download/v0.34/docker-volume-netshare_0.34_linux_amd64-bin
sudo mv docker-volume-netshare_0.34_linux_amd64-bin /usr/bin/docker-volume-netshare
chmod 755 /usr/bin/docker-volume-netshare
chown root:root /usr/bin/docker-volume-netshare

動くこと確認

docker-volume-netshare -h
docker-volume-netshare (NFS V3/4, AWS EFS and CIFS Volume Driver Plugin)

Provides docker volume support for NFS v3 and 4, EFS as well as CIFS. This plugin can be run multiple times to
support different mount types.

== Version: 0.34 - Built: 2017-05-29T13:06:34-07:00 ==

Usage:
docker-volume-netshare [command]

Available Commands:
ceph run plugin in Ceph mode
cifs run plugin in CIFS mode
efs run plugin in AWS EFS mode
nfs run plugin in NFS mode
version Display current version and build date

Flags:
--basedir string Mounted volume base directory (default "/var/lib/docker-volumes/netshare")
--port string TCP Port if --tcp flag is true. :PORT for all interfaces or ADDRESS:PORT to bind. (default ":8877")
--tcp Bind to TCP rather than Unix sockets. Can also be set via NETSHARE_TCP_ENABLED
--verbose Turns on verbose logging

Use "docker-volume-netshare [command] --help" for more information about a command.

LAN内でNASに無制限アクセスできる場合は(参考:Launching in Samba/CIFS modeあたり

sudo docker-volume-netshare cifs --domain ドメイン名(windowsだとWORKGROUPとかになってるやつ)

で、docker用にボリュームマウントしておいて

docker run -it --volume-driver=cifs -v CIFSのパス):/mount ubuntu /bin/bash

とdockerを起動してやる。cifsのパスは先頭の//が不要なので注意。

 

これで、動くみたいだけどこのままだとサーバ再起動のたびにマウントしなくてはいけないので、Systemdに登録しておく。

長くなったのでこちら

まだ動いてなかった

docker-machineでcreateしたdockerだけど、離席から帰ってきたら動いていなかった。

[yoshitake@localhost docker-repo]$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
testsv   -        generic      Stopped                                       Unknown

離席前にリモートのサーバrebootかけてたな。
いったんdocker-machine rmしてから作り直そうとしたけど繋がらなそう。
直に通常のssh接続しようとしても繋がらず。

単純にssh繋がらないだけっぽい。
ということでさくらVPSなので管理画面から接続。

やったことを改めて思い返すとdocker-machine入らなかったのでSELinux一時停止して試したままだった。んで、ssh port変更したけどSELinuxの設定していない。

(ここからVPNの管理コンソールなのでコピペはなし)
semanage port -l| grep ssh で新しいポート表示されず。
semanage port -a -t ssh_port_t -p tcp nnnnn もした履歴無し。
jarnalctl -xe にsshd上げるときにポートのパーミッションがなくてバインド失敗したメッセージが出ていました

docker-machineが古かった

docker-machineでCentOS7に入れたdockerが起動しなかった。

インストール元

Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with centos...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error creating machine: Error running provisioning: exit status 5

インストール先

[root@testsv system]# systemctl status docker.service -l
 * docker.service - Docker Application Container Engine
 Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
 Active: inactive (dead) since Wed 2017-05-10 18:15:08 JST; 28min ago
 Main PID: 13716 (code=exited, status=0/SUCCESS)

May 10 18:15:03 testsv dockerd[13716]: time="2017-05-10T18:15:03.609609938+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
 May 10 18:15:04 testsv dockerd[13716]: time="2017-05-10T18:15:04.102333287+09:00" level=info msg="Loading containers: done."
 May 10 18:15:04 testsv dockerd[13716]: time="2017-05-10T18:15:04.124630882+09:00" level=info msg="Daemon has completed initialization"
 May 10 18:15:04 testsv dockerd[13716]: time="2017-05-10T18:15:04.124714583+09:00" level=info msg="Docker daemon" commit=89658be graphdriver=overlay version=17.05.0-ce
 May 10 18:15:04 testsv dockerd[13716]: time="2017-05-10T18:15:04.146221898+09:00" level=info msg="API listen on /var/run/docker.sock"
 May 10 18:15:04 testsv systemd[1]: Started Docker Application Container Engine.
 May 10 18:15:07 testsv systemd[1]: Stopping Docker Application Container Engine...
 May 10 18:15:07 testsv dockerd[13716]: time="2017-05-10T18:15:07.527842954+09:00" level=info msg="Processing signal 'terminated'"
 May 10 18:15:07 testsv dockerd[13716]: time="2017-05-10T18:15:07.53054844+09:00" level=info msg="stopping containerd after receiving terminated"
 May 10 18:15:08 testsv systemd[1]: Stopped Docker Application Container Engine.

症状をみるとこれっぽい。日付けをみるとだいぶ古いけど、masterには取り込まれているから〜といっている。ちゅうことは、docker-machineが古いな。

日本語ドキュメントのワンライナー手順で入れたけど、リリースページを確認するとにほんご頁よりも大分バージョンが上がっている。
リリースページの手順で再インストール。

Provisioning with centos...
Error creating machine: Error running provisioning: something went wrong running an SSH command
command : sudo systemctl -f restart docker
err     : exit status 5
output  : Failed to restart docker.service: Unit not found.

そのままもう一回docker-machine rm -> docker-machine createは失敗。
インストール先で
rm /etc/systemd/system/docker.service

yum remove docker-engine
したら取り敢えず入った。

動作確認はこれから