thirose’s blog

openstackやpythonなどなど

Docker-Compose を使って volumeをマウントするときにpermission errorが返ってくる

前提

Docker/Kubernetes 実践コンテナ開発入門 の 2.6 Composeによる複数コンテナの実行 で 以下のようにvolumesをマウントするところでの問題です。

version: "3"
services:
  master:
  container_name: master
  image: jenkins: latest
  ports:
    - 8080:8080
  volumes:
    - ./jenkins_home:/var/jenkins_home

問題

上のdocker-compose.ymlを実行すると

$ docker-compose up
Creating master ... done
Attaching to master
master    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
master    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
master exited with code 1

このように Permission deniedとなり起動できません。 そのため、以下の対応が必要になります。

対応

version: "3"
services:
  master:
    container_name: master
    image: jenkins:latest
    ports:
      - 8080:8080

docs.docker.com こちらに書かれているようにvolumesを追記してあげればファイルを共有できるようになります。

$ docker-compose up
Creating master ... done
Attaching to master
master    | Running from: /usr/share/jenkins/jenkins.war
master    | webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
master    | Jan 28, 2020 10:09:19 AM Main deleteWinstoneTempContents
master    | WARNING: Failed to delete the temporary Winstone file /tmp/winstone/jenkins.war
master    | Jan 28, 2020 10:09:19 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Logging initialized @370ms
master    | Jan 28, 2020 10:09:19 AM winstone.Logger logInternal
master    | INFO: Beginning extraction from war file
master    | Jan 28, 2020 10:09:21 AM org.eclipse.jetty.util.log.JavaUtilLog warn
master    | WARNING: Empty contextPath
master    | Jan 28, 2020 10:09:21 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: jetty-9.2.z-SNAPSHOT
master    | Jan 28, 2020 10:09:22 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
master    | Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
master    | Jan 28, 2020 10:09:22 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Started w.@47404bea{/,file:/var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
master    | Jan 28, 2020 10:09:22 AM org.eclipse.jetty.util.log.JavaUtilLog info
master    | INFO: Started ServerConnector@458342d3{HTTP/1.1}{0.0.0.0:8080}
master    | Jan 28, 2020 10:09:22 AM org.eclipse.jetty.util.log.JavaUtilLog info

確認

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
494f2620e919        jenkins:latest      "/bin/tini -- /usr..."   16 seconds ago      Up 14 seconds       0.0.0.0:8080->8080/tcp, 50000/tcp   master
$  docker exec -it master /bin/bash
jenkins@494f2620e919:/$ cat /var/jenkins_home/
cat: /var/jenkins_home/: Is a directory
jenkins@494f2620e919:/$ ls /var/jenkins_home/
.bash_logout                         .profile                             hudson.model.UpdateCenter.xml        jenkins.CLI.xml                      logs/                                plugins/                             secrets/                             users/
.bashrc                              config.xml                           identity.key.enc                     jenkins.install.UpgradeWizard.state  nodeMonitors.xml                     secret.key                           updates/                             war/
.java/                               copy_reference_file.log              init.groovy.d/                       jobs/                                nodes/                               secret.key.not-so-secret             userContent/                         

ファイルまで確認。volumesのマウントとは違うけどとりあえず見れたから目的は達成。

ここらへん確認してると、まず一回volumeマウントしないで chown -R 1000 /var/jenkisn_home するような解決作もあるっぽいけど、 今回はそれはなんか違う気がしたのでいったんこれで。

追記

jenkins_home ディレクトリの権限を編集( chmod 777 jenkins_home )すれば問題なく動く。

今回読んでる本

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門