Ich lerne Docker mit ROS zu verwenden und bin von dieser Fehlermeldung überrascht:

FROM ros:kinetic-robot-xenial

# create non-root user
ENV USERNAME ros
RUN adduser --ingroup sudo --disabled-password --gecos "" --shell /bin/bash --home /home/$USERNAME $USERNAME
RUN bash -c 'echo $USERNAME:ros | chpasswd'
ENV HOME /home/$USERNAME
USER $USERNAME

RUN apt-get update

Gibt diese Fehlermeldung aus

Step 7/7 : RUN apt-get update
 ---> Running in 95c40d1faadc
Reading package lists...
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
The command '/bin/sh -c apt-get update' returned a non-zero code: 100
3
pitosalas 19 Jän. 2019 im 17:39

4 Antworten

Beste Antwort

apt-get muss im Allgemeinen als root ausgeführt werden. Sobald Sie jedoch einen USER Befehl ausgeführt haben, werden Befehle nicht mehr als root ausgeführt.

Sie führen häufig Befehle wie diesen am Start der Docker-Datei aus: Sie möchten das Docker-Layer-Caching nutzen, wenn Sie können, und Sie installieren normalerweise Abhängigkeiten, die der Rest der Docker-Datei benötigt. Auch aus Gründen des Layer-Caching ist es wichtig, apt-get update und andere Installationsschritte in einem einzigen Schritt auszuführen. Ihre Docker-Datei sieht also normalerweise so aus

FROM ros:kinetic-robot-xenial
# Still root
RUN apt-get update \
 && apt-get install ...
# Copy in application (still as root, won't be writable by other users)
COPY ...
CMD ["..."]
# Now as the last step create a user and default to running as it
RUN adduser ros
USER ros

Bei Bedarf können Sie explizit USER root verwenden, um für nachfolgende Befehle wieder zu root zu wechseln. In der Regel ist es jedoch einfacher, Docker-Dateien mit weniger Benutzerwechsel zu lesen und zu verwalten.

Beachten Sie auch, dass weder sudo noch Benutzerkennwörter in Docker wirklich nützlich sind. Es ist schwierig, sudo in einem Skript im Allgemeinen auszuführen, und viele Docker-Dinge passieren in Skripten. In Containern werden auch fast nie Dinge wie getty oder sshd ausgeführt, die möglicherweise Benutzerkennwörter akzeptieren könnten, und es ist trivial, von docker history zurückzulesen. Es macht also keinen Sinn, eines festzulegen. Wenn Sie dagegen in der Lage sind, eine Shell in einem Container abzurufen, können Sie -u root jederzeit an den Befehl docker run oder docker exec übergeben, um eine Root-Shell abzurufen.

4
David Maze 19 Jän. 2019 im 17:43

Versuchen Sie, diese Zeile am Ende Ihrer Docker-Datei einzufügen

USER $ USERNAME (sobald diese Zeile in der Docker-Datei angezeigt wird ... Sie übernehmen die Berechtigungen dieses Benutzers ... die in diesem Fall nichts installieren müssen) sind Sie standardmäßig root

1
nitin antony 19 Jän. 2019 im 18:30

Sie fügen den Benutzer ros zur Gruppe sudo hinzu, versuchen jedoch, apt-get update zu verwenden, ohne sudo zu verwenden. Daher führen Sie den Befehl unprivilegiert aus und erhalten das permission denied.

Verwenden Sie den Befehl (t):

FROM ros:kinetic-robot-xenial

RUN whoami
RUN apt-get update
# create non-root user
RUN apt-get install sudo
RUN echo "ros ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers
ENV USERNAME ros 
RUN adduser --ingroup sudo --disabled-password --gecos "" --shell /bin/bash --home /home/$USERNAME $USERNAME
RUN bash -c 'echo $USERNAME:ros | chpasswd'
ENV HOME /home/$USERNAME
USER $USERNAME

RUN whoami
RUN sudo apt-get update

Alles in allem macht das nicht viel Sinn. Es ist in Ordnung, ein Docker-Image (z. B. Software installieren usw.) mit seinem Root-Benutzer vorzubereiten. Wenn Sie sich Sorgen um die Sicherheit machen (was eine gute Sache ist), lassen Sie das Sudo-Zeug und stellen Sie sicher, dass die Prozesse, die ausgeführt werden, wenn das Image ausgeführt wird (z. B. der Container erstellt wird), mit Ihrem nicht privilegierten Benutzer ...

Berücksichtigen Sie auch mehrstufige Builds, wenn Sie die Vorbereitung des Images von der eigentlichen ausführbaren Sache trennen möchten:

https://docs.docker.com/develop/develop-images/multistage-build/

0
sontags 19 Jän. 2019 im 16:06

Wechseln Sie zum Root-Benutzer durch:

USER root

Und dann sollte jeder Befehl funktionieren

0
user3041840 17 Dez. 2019 im 16:19