Docker for Mac 17.06.0-ce-mac17を実行しているOSXホストで、実行中のjenkins dockerコンテナー( jenkins:latest 内からdockerを呼び出そうとしています。 ))、 http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ 。
/var/run/docker.sockをコンテナーにマウントし、その中にubuntu dockerバイナリを貼り付けて実行できますが、コンテナー内からユーザー「jenkins」として実行します。 「dockerps」を取得します
Unix:///var/run/docker.sockでDockerデーモンソケットに接続しようとしたときにアクセス許可が拒否されました:Get http://%2Fvar%2Frun%2Fdocker.sock/v1 .30/containers/json?all = 1 :unix /var/run/docker.sockにダイヤル:接続:アクセス許可が拒否されました。
Root(docker exec -u 0)としてコンテナーに接続すると、それでも機能します。
これを実行するには、jenkinsユーザーが必要です。 Dockerグループを追加してubuntuコンテナ内にjenkinsを追加しようとしましたが、外部とは関係がなく、Docker for MacはLinuxでこれを実行するように機能しないため、役に立ちませんでした。 uid/gidマッチング。このコンテナを配布したいので、Docker forMacのインストールの一部をハックするという答えは実際には役に立ちません。助けることができれば、jenkinsセットアップ全体をrootとして実行したくありません。 (私はまた、特権としてコンテナーを実行しようとしましたが、それは役に立ちませんでした。)
MacbookでJenkinsパイプラインを実行しているときにDockerデーモンに接続しようとしたときに Permission Deniedのアドバイスに従って 内部の/var/run/docker.sockファイルをchownしましたコンテナを手動でjenkinsに送信すると、jenkinsはdockerを実行できるようになります。しかし、配布可能なコンテナの解決策を思い付くのに問題があります-ファイルがまだ存在しないため、Dockerfileでそのchownを行うことはできません。また、エントリポイントにシムインしても、jenkinsとして実行されるため役に立ちません。 。
Macで外部Dockerコンテナを非rootユーザーとしてコンテナ内から実行するイメージをビルドして実行するには、何をする必要がありますか?
私はこれを動作させました。少なくとも自動化されていますが、現在はMac用のdockerでのみ動作しています。 Docker for Macには独自のファイルパーミッションモデルがあります 。 /var/run/docker.sockをjenkinsユーザーに手動でチャウニングすることは手動で機能し、コンテナーの再起動やイメージの再生成の間も持続しますが、過去のdockerデーモンの再起動は持続しません。さらに、docker.sockがまだ存在しないため、Dockerfileでchownを実行できません。また、jenkinsとして実行されるため、エントリポイントでchownを実行できません。
Macでは/var/run/docker.sockが/Users//Library/Containers/com.docker.docker/Data/ s60にシンボリックリンクされているため、私が行ったのは「スタッフ」グループにジェンキンスを追加することでした。 uidとgidのスタッフです。これにより、jenkinsユーザーはホスト上でdockerコマンドを実行できます。
Dockerfile:
FROM jenkins:latest
USER root
RUN \
apt-get update && \
apt-get install -y build-essential && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY docker /usr/bin/docker
# To allow us to access /var/run/docker.sock on the Mac
RUN gpasswd -a jenkins staff
USER jenkins
ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]
docker-compose.ymlファイル:
version: "3"
services:
jenkins:
build: ./cd_jenkins
image: cd_jenkins:latest
ports:
- "8080:8080"
- "5000:5000"
volumes:
- ./jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
ただし、これは他のシステムに移植することはできません(MacグループのDockerが「スタッフ」のままであることに依存しますが、これは保証されていないと思います)。このソリューションをホストシステム全体で機能させるために提案された改善が欲しいです。 jenkins dockerコンテナ内でdocker Hostコマンドを実行する のような質問で提案された他のオプションは次のとおりです。
これに従ってください: https://forums.docker.com/t/mounting-using-var-run-docker-sock-in-a-container-not-running-as-root/3439
基本的に、あなたがする必要があるのは、コンテナ内の/var/run/docker.sock
権限を変更し、Sudo
でdockerを実行することだけです。
以下を支援するために使用できるDockerfileを作成しました。
FROM jenkinsci/blueocean:latest
USER root
# change docker sock permissions after moutn
RUN if [ -e /var/run/docker.sock ]; then chown jenkins:jenkins /var/run/docker.sock; fi
私のために働いた別のアプローチ-uid引数を/var/run/docker.sock(私の場合は501)を所有するuidに設定します。 Dockerfileの構文はわかりませんが、docker-compose.ymlの場合は次のようになります。
version: 3
services:
jenkins:
build:
context: ./JENKINS
dockerfile: Dockerfile
args:
uid: 501
volumes:
- /var/run/docker.sock:/var/run/docker.sock
...
これは、Dockerfileを使用してjenkinsイメージを構築することに基づいているため、多くの詳細が省略されていることに注意してください。ここで重要なのはuid: 501
args
の下。