問題
ホストOS
$ docker run -d -v /path/from/host:/path/to/docker:ro test
$ ls -al /path/from/host
total 4
drwxr-xr-x. 2 500 500 45 Dec 25 16:26 .
drwxr-xr-x. 3 jenkins jenkins 19 Dec 25 16:26 ..
コンテナ
$ ls -al /path/to/docker/
drwxr-xr-x. 2 defaultuser defaultuser 45 Dec 25 16:26 .
drwxr-xr-x. 3 root root 19 Dec 25 16:26 ..
・・・記憶があいまいなので正確ではないかもしれませんが、こんな感じだったと思います。
共有フォルダの所有者が、ホスト側とコンテナ側で一致しない(し、そもそもそんなユーザーがいない)という現象が起きてしまって、共有なのに相互に書き込めないということになってしまいました。
コンテナ側のユーザーにはsudoを持たせればなんとでもなりますが、ホスト側のJenkinsユーザーには安易にsudoを持たせたくなかったので、なんとかならないかと思っていました。
解決?
uidを合わせればよさそう
ホストOS
groupadd -g 1200 docker
useradd jenkins -M -u 1250 -G docker
Dockerfile
RUN usermod -u 1250 projects && \
gid=`id -g projects` && \
groupmod -g 1250 projects && \
find /home/projects -gid $gid -exec chgrp projects {} \;
- ※ホスト側ではDockerもJenkinsもインストールする前に
1200
番と1250
番(数字は適当)でユーザー作成しておきます。 - ※コンテナは既存のImageを使用することを前提にしていますので、ファイル共有が必要なユーザー(ここでは
projects
)にホストのJenkinsユーザーと同じIDを付与し、ホームディレクトリ以下の権限を変更します。 - ※ホームディレクトリ以下のuidは勝手に変更されるようです。
- ※ホームディレクトリ以外を共有する場合は別途uidとgidの変更が必要です。
確認
ホスト
$ ls -al /var/lib/jenkins/jobs/test/workspace/docker
total 4
drwxrwxr-x. 2 jenkins jenkins 45 Dec 25 16:26 .
drwxr-xr-x. 3 jenkins jenkins 19 Dec 25 16:26 ..
-rw-rw-r--. 1 jenkins jenkins 0 Dec 25 16:26 id_rsa
コンテナ
$ ls -al /home/projects/jenkins
total 4
drwxrwxr-x. 2 projects projects 45 Dec 25 16:26 .
drwxr-xr-x. 3 root root 19 Dec 25 16:26 ..
-rw-rw-r--. 1 projects projects 0 Dec 25 16:26 id_rsa
これで、Jenkinsからもコンテナからも自由に書き込みできるようになりました。
しばらくこれで使ってみます。
めでたし