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コマンドで適宜切り換えていくやり方がいいかもしれません。