web-dev-qa-db-ja.com

Dockerコンテナー内でSudoを使用する方法

通常、dockerコンテナはユーザー root を使って実行されます。別のユーザーを使いたいのですが、dockerのUSERディレクティブを使用しても問題ありません。しかし、このユーザはコンテナ内で Sudo を使用できるはずです。このコマンドはありません。

これがこの目的のための単純なDockerfileです:

FROM ubuntu:12.04

RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker

USER docker
CMD /bin/bash

このコンテナーを実行して、私はユーザー 'docker'でログインします。 Sudoを使おうとすると、コマンドが見つかりません。そこで私はDockerfileの中に Sudo パッケージをインストールしてみました。

RUN apt-get install Sudo

パッケージSudoが見つかりません

188
drubb

ちょうどそれを手に入れました。 reganが指摘したように、私はユーザーをsudoersグループに追加しなければなりませんでした。しかし主な理由は、リポジトリキャッシュを更新するのを忘れていたため、apt-getがSudoパッケージを見つけられなかったことです。今働いています。完成したコードは次のとおりです。

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install Sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker Sudo

USER docker
CMD /bin/bash
196
drubb

他の答えは私にはうまくいきませんでした。私は検索を続け、 ブログ投稿 を見つけ、チームがdockerコンテナの中でroot以外で実行していた方法をカバーしました。

これがTLです; DR版:

RUN apt-get update
RUN apt-get install Sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker Sudo
RUN echo '%Sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN Sudo apt-get update 

これにはFROM node:9.3を使用していましたが、他の同様のコンテナベースも同様に機能すると思われます。

37
M. Scott Ford

Sudoもapt-getもコンテナで利用できない場合は、コマンドを使用してrootユーザとして実行中のコンテナにジャンプすることもできます。

docker exec -u root -t -i container_id /bin/bash
35

コンテナに接続して何かをインストールしたい場合
apt-getを使う
最初に上記のように私達の兄弟 "TomášZáluský"から答え

docker exec -u root -t -i container_id /bin/bash

それから

Apt-get updateまたはapt-get '任意のもの'を実行してください。

それは私と一緒にうまくいった

13
Ismail

すでに実行中のコンテナでこの問題が発生し、必ずしも再構築したくない場合は、次のコマンドを実行しているコンテナにroot権限で接続します。

docker exec -ti -u root container_name bash

次のように検索することで、名前ではなくIDを使用して接続することもできます。

docker ps -l

次回コンテナ(またはdocker-compose cluster)を起動したときに変更が保存されるように変更を保存するには

docker commit container_id image_name

実行されていないコンテナを起動してrootとして接続するには:

docker run -ti -u root --entrypoint=/bin/bash container_name -s

実行中のコンテナからコピーするには:

docker cp <containerId>:/file/path/within/container /Host/path/target

画像のコピーをエクスポートするには:

docker save container | gzip > /dir/file.tar.gz

これを使用して他のDockerインストールに復元できます。

gzcat /dir/file.tar.gz | docker load

それはずっと速いですが、圧縮しないためにもっと多くのスペースを取ります:

docker save container | dir/file.tar

そして:

cat dir/file.tar | docker load
4
Chris

Sudoコマンドにアクセスする必要があるスクリプト(これは変更できません)を実行するコンテナーがrootとして実行されている場合は、渡されたコマンドを呼び出す新しいSudoスクリプトを$PATHに作成するだけで済みます。

例えばあなたのDockerfileで:

RUN if type Sudo 2>/dev/null; then \ 
     echo "The Sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/Sudo; \
     chmod +x /usr/sbin/Sudo; \
    fi
1
XtraSimplicity