Permission denied Fehler aufrufen Docker auf Mac-host von innen Andockfenster Ubuntu-container als nicht-root-Benutzer

Ich versuche zu aufrufen Andockfenster auf meine OSX-host ausgeführt wird Docker für Mac 17.06.0-ce-mac17 aus dem inneren einer Laufenden jenkins docker-container (jenkins:neueste), gemäß dem Verfahren beschrieben in http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/.

Ich mount /var/run/docker.Socke in den container, ich stick ein ubuntu docker-binary drin, und es ist in der Lage zu führen – aber aus dem inneren der container als user „jenkins“ wenn ich z.B. „docker ps“ ich bekomme

Erhielt die Erlaubnis verweigert beim Versuch, eine Verbindung zu den Docker-daemon bei unix-socket:///var/run/docker.Socke: Holen Sie sich http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all=1: dial unix /var/run/docker.Socke: connect: permission denied.

Wenn ich eine Verbindung zum container als root (docker exec -u 0) funktioniert es aber.

Brauche ich den jenkins-Benutzer ausgeführt werden kann. Ich habe versucht, hinzufügen eines docker-Gruppe und hinzufügen von jenkins, um es in den ubuntu-container, aber das hat nicht helfen, denn es hat nichts zu tun mit der Außenwelt und Docker für Mac funktioniert nicht, wie läuft das auf linux, wo man halb-einfach-uid/gid-matching. Ich möchte die Verteilung dieser container, so Antworten, dass Sie gehen und hack Teil meiner Docker für Mac installieren, wird nicht wirklich helfen, mir. Ich möchte lieber nicht ausführen die gesamte jenkins-setup als root, wenn ich helfen kann. (Ich habe auch versucht Ausführung des Containers als privilegierte, das hat nicht geholfen.)

Pro die Beratung in Permission Denied beim Versuch, eine Verbindung zu Docker-Daemon während der Ausführung Jenkins-pipeline im Macbook ich chowned /var/run/docker.sock Datei in den container manuell zu jenkins und jenkins jetzt laufen kann Andockfenster. Aber ich habe Schwierigkeiten zu kommen mit einer Lösung für ein verteilbaren container – ich kann das nicht chown im Dockerfile, weil die Datei noch nicht existiert, und ausgleichend in den entrypoint nicht helfen, weil das läuft wie jenkins.

Was muss ich tun, um erstellen und ausführen eines Bildes ausgeführt wird, externe docker-Container auf meinem Mac als nicht-root-Benutzer aus dem inneren der container?

  • Docker für Mac läuft ein Alpine-Linux-VM, und das ist, wo alles, was Sie ausführen, tatsächlich ausgeführt wird. Auf meinem system, der Benutzer „Andockfenster“ drin, dass VM uid 1001. Wenn Sie Jenkins uid 1001 in Ihrer VM, funktioniert es?
  • Tatsächlich fand ich eine ähnliche Frage von gestern (!): stackoverflow.com/questions/44978017/… und ich chowned /var/run/docker.Socke mit jenkins aus dem inneren des Containers und nun jenkins ausgeführt werden können docker-Befehle auf dem host. Es scheint nur die Datei ändern, Eigentumsverhältnisse im inneren des Behälters, nicht draußen, das ist nicht das, was ich erwartet habe, wurde ich zu uids/gids passender, aber ich denke, Docker für Mac, die Sie so verrückt. Nur müssen shim dies in die entrypoint nun ich denke,… Wird selbst post eine Antwort, sobald es funktioniert.
  • Hmm, das ist nicht gut. Ich kann es nicht im Dockerfile, weil /var/run/docker.sock existiert nicht vor der VOLUME-Erstellung und-Sie können es nicht mehr ändern nach der VOLUME-Erstellung entweder weil Andockfenster. Und der entrypoint läuft wie jenkins so ausgleichend es dort nicht helfen.
  • Ich habe auch versucht, läuft es als Benutzer 1001 in den container, das hat nicht funktioniert obwohl.
  • Dreht sich auf meinem Mac, /var/run/docker.Socke ist symlinked nach unten in “ /Benutzer/<username>/Library/Containers/com.Andockfenster.Andockfenster/Data/s60 und ist uid <username> und gid-Mitarbeiter – also das hinzufügen von „RUN gpasswd-a jenkins Personal“ im dockerfile macht es Arbeit – auf einem Mac mit Docker für Mac-mindestens, wahrscheinlich nicht auf irgendeine andere config, also lasse ich diese öffnen Sie auf der Suche nach einer Allgemeinen Lösung (also jeder auf einer anderen config verbrauchen kann das Bild).
  • Ich vergaß, diese Marotte von osxfs Berechtigungen. Siehe meine Antwort hier für weitere Informationen über wie osxfs befasst sich mit dem Umfang der Berechtigungen. Es ist nicht die gleiche Weise verhält es sich auf Linux-Systemen. stackoverflow.com/a/43213455/2449905
  • Es gibt auch docs, die auf der docker-Website für diese – docs.docker.com/docker-for-mac/osxfs/#ownership
  • Ja, ich fand, dass, stellt sich heraus, das chowned Eigentum hält, auch durch das löschen von images und volumes, aber natürlich nicht über docker-daemon neu gestartet, da die Datei wird entfernt und readded 🙁



3 Replies
  1. 1

    Weiteren Ansatz, der arbeitete für mich – legen Sie die uid-argument, um die uid, die Eigentümer /var/run/docker.Socke (501 in meinem Fall). Nicht sicher über die syntax für Dockerfile, aber für docker-Komponieren.yml, es ist so:

    version: 3
    services:
      jenkins:
        build:
          context: ./JENKINS
          dockerfile: Dockerfile
          args:
            uid: 501
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        ...
    

    Hinweis: diese basiert auf der Verwendung eines Dockerfile zu bauen, die jenkins Bild, so viele details ausgelassen. Der bit-Schlüssel ist hier die uid: 501 unter args.

  2. 0

    Habe ich diese Arbeit, zumindest automatisiert, aber Sie funktioniert momentan nur auf docker für Mac. Docker für Mac hat eine einzigartige Datei, die Erlaubnis-Modell. Chowning /var/run/docker.Socke auf der jenkins user manuell arbeiten, und es bleibt in container neu gestartet und sogar Bild-regeneration, aber nicht in der Vergangenheit docker-daemon neu gestartet. Plus, können Sie nicht die chown im Dockerfile, weil Andockfenster.sock noch nicht vorhanden, und man kann es nicht in die entrypoint, denn das läuft als jenkins.

    Also, was ich Tat, war fügen Sie jenkins zu der Gruppe „Personal“, weil auf meinem Mac, /var/run/docker.Socke ist symlinked nach unten in /Users//Library/Containers/com.Andockfenster.Andockfenster/Data/s60 und ist die uid-und gid-Mitarbeiter. Dadurch kann der jenkins Benutzer laufen docker-Befehle auf dem host.

    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-Komponieren.yml-Datei:

    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
    

    Dies ist jedoch nicht auf andere Systeme portierbar (und hängt davon ab, dass docker für mac-Gruppe bleiben, „Mitarbeiter“, die ich mir vorstellen ist das nicht garantiert). Ich würde gerne Verbesserungsvorschläge zu machen, diese Lösung funktioniert über host-Systeme. Andere Optionen vorgeschlagen, in Fragen wie Ausführen von docker host-Befehl innerhalb jenkins docker-container gehören:

    • Installieren sudo und ließ jenkins sudo und führen alle docker-Befehle mit sudo: fügt Sicherheitsprobleme
    • „Jenkins hinzufügen der docker-Gruppe“ – nur UNIX und wahrscheinlich stützt sich auf den entsprechenden gids vom host auf den container rechts?
    • Setuid ‚ Ing das Andockfenster enthalten ausführbaren funktionieren könnte, hat aber die gleichen Sicherheits-elevation Themen wie sudo.
    • Dies ist interessant, Sie sind das kopieren von Mac docker-binary in das image? Dies scheint nicht für mich arbeiten.
    • Nein, ein ubuntu-Andockfenster binäre.
  3. 0

    Folgen Sie dieser: https://forums.docker.com/t/mounting-using-var-run-docker-sock-in-a-container-not-running-as-root/34390

    Im Grunde alles, was Sie tun müssen, ist zu ändern /var/run/docker.sock Berechtigungen innerhalb Ihrer container und führen Sie das Andockfenster mit sudo.

    Habe ich ein Dockerfile, die verwendet werden können, um zu helfen:

    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
    

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.