通常、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が見つかりません
ちょうどそれを手に入れました。 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
他の答えは私にはうまくいきませんでした。私は検索を続け、 ブログ投稿 を見つけ、チームが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
を使用していましたが、他の同様のコンテナベースも同様に機能すると思われます。
Sudoもapt-getもコンテナで利用できない場合は、コマンドを使用してrootユーザとして実行中のコンテナにジャンプすることもできます。
docker exec -u root -t -i container_id /bin/bash
コンテナに接続して何かをインストールしたい場合
apt-getを使う
最初に上記のように私達の兄弟 "TomášZáluský"から答え
docker exec -u root -t -i container_id /bin/bash
それから
Apt-get updateまたはapt-get '任意のもの'を実行してください。
それは私と一緒にうまくいった
すでに実行中のコンテナでこの問題が発生し、必ずしも再構築したくない場合は、次のコマンドを実行しているコンテナに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
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