webdevqa.jp.net

非rootユーザーとしてDockerUbuntuコンテナ内からMacホスト上のDockerを呼び出すエラーを許可が拒否されました

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コマンドを実行する のような質問で提案された他のオプションは次のとおりです。

  • Sudoをインストールし、jenkins Sudoを使用して、Sudoですべてのdockerコマンドを実行します。セキュリティの問題が追加されます
  • 「jenkinsをdockerグループに追加する」-UNIXのみで、おそらくホストからコンテナへのギッドのマッチングに依存していますか?
  • 含まれているdocker実行可能ファイルのsetuidは機能する可能性がありますが、Sudoと同じセキュリティ昇格の問題があります。

これに従ってください: 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
1
Tomer

私のために働いた別のアプローチ-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: 501argsの下。

1
ash