dockerfileでRUN sudo〜をつかうとbuildに失敗するときの対処


Dockerfileをbuild中・・

以下のエラーが発生しました。
翻訳すると「sudo: tty が存在せず、askpass プログラムが指定されていない」とのこと。

sudo: no tty present and no askpass program specified

エラーの箇所は・・?

rootユーザからhostと同名のユーザに切り替えて、
sudoを使ってコマンドを実施している部分です。

〜〜〜〜上記略
USER $HOME_USER

RUN sudo apt-get    install -y  \
〜〜〜〜以下略

原因・対応

原因を調べたところ、sudoするときにpassword要求されていることにあるらしいです。
なので、sudoersにpasswordなしの設定を加えることにしました。

コンテナの中の/etc/sudoersをDockerfileと同じ階層にコピーして、最終行に以下を追記します。
(myusernameは$HOME_USERの値)

# /etc/sudoerの最終行に以下を追記
myusername  ALL=(ALL) NOPASSWD: ALL

DokerfileにADD sudoers /etcを追記

〜〜〜〜上記略
ADD sudoers /etc
USER $HOME_USER

RUN sudo apt-get    install -y  \
〜〜〜〜以下略

これで解決・・?

これでsudoするときにパスワードが不要になり、buildし直すとエラー自体は発生しなくなりました。

注意

ただし、個別ユーザにsudoするときに全権を与えるのでセキュリティ的には危険です。
さらに気になって調べた所、Dockerfile のベストプラクティスのUSERの項目に以下の記載がありました。

TTY やシグナル転送を使わないつもりであれば、 sudo のインストールや使用を避けたほうが良いでしょう。使うことで引き起こされる問題の解決は大変だからです。もし、どうしても sudo のような機能が必要であれば(例:root としてデーモンを初期化するが、実行は root 以外で行いたい時)、 「 gosu 」を使うことができます。

結論

というわけで、Dockerfile内ではsudoは使わずに、厳密にUSERコマンドで適宜切り換えていくやり方がいいかもしれません。

参考