私は、Dockerをインストールし、docker-composeファイルを使用してコンテナーを作成した、Oracle Linuxをホストする仮想マシンを持っています。 jenkinsボリュームを共有フォルダーの下に配置しましたが、docker-composeを起動すると、Jenkinsに対して次のエラーが発生しました。
ジェンキンス| touch: ‘/var/jenkins_home/copy_reference_file.log'にタッチできません:アクセス許可がjenkinsを拒否しました| /var/jenkins_home/copy_reference_file.logに書き込めません。ボリュームの権限が間違っていますか?ジェンキンスはコード1で終了しました
これがボリューム宣言です
volumes:
- "/media/sf_devops-workspaces/dev-tools/continuous-integration/jenkins:/var/jenkins_home"
問題は、コンテナー内のユーザーが、ホスト上のユーザーとは異なるuserid:groupidを持っていることです。
次の2つの可能性があります。
コンテナー内のユーザーが、マウントされたボリュームにアクセスできるホスト上のユーザーと同じuserid:groupidを持っていることを確認できます。このためには、Dockerfileでユーザーを調整する必要があります。同じuserid:groupidでdockerfileにユーザーを作成してから、このユーザーに切り替えます https://docs.docker.com/engine/reference/builder/#user
ホスト上のユーザーが、コンテナー内のユーザーと同じuserid:groupidを持っていることを確認できます。このためには、docker exec -it <container-name> bash
を使用してコンテナーを入力し、ユーザーID id -u <username>
グループID id -G <username>
を表示します。マウントされたボリュームの権限をこのuserid:groupidに変更します。
-uパラメーターを使用するように簡単に修正します。これはrootユーザー(uid = 0)として実行されることに注意してください
docker run -u 0 -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
Haschibaschiが述べたように、コンテナー内のユーザーには、ホスト上のユーザーとは異なるuserid:groupidがあります。
これを回避するには、(問題のある)ボリュームマッピングなしでコンテナーを起動し、コンテナーでbashを実行します。
docker run -p 8080:8080 -p 50000:50000 -it jenkins bin/bash
コンテナーのシェルの内部でidコマンドを実行すると、次のような結果が得られます。
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
コンテナーを終了し、マップして実行しようとしているフォルダーに移動します。
chown -R 1000:1000 .
許可が一致したので、ボリュームマッピングを使用して元のdockerコマンドを実行できるはずです。
まず、echo $USER
コマンドを使用して現在のユーザーを確認し、その後、Dockerfileで次のように誰がユーザーであるかを説明できます(私の場合、ユーザーはrootです) screenshot
このエラーは、次のコマンドを使用して解決します。
jenkinsデータマウントパスに移動します:/ media
次のコマンドを実行します。
cd /media
Sudo chown -R ubuntu:ubuntu sf_devops-workspaces
jenkins Dockerコンテナを再起動します
docker-compose restart jenkins
SELinuxを使用している可能性があります。特権付きでコンテナを実行すると、問題が解決しました:
Sudo docker run --privileged -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
https://docs.docker.com/engine/reference/commandline/run/#full-container-capabilities---privileged から:
--privilegedフラグはコンテナーにすべての機能を提供し、デバイスのcgroupコントローラーによって適用されるすべての制限を解除します。つまり、コンテナはホストが実行できるほとんどすべてのことを実行できます。このフラグは、Docker内でDockerを実行するような特別なユースケースを許可するために存在します。