1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?