質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

6461閲覧

Docker内のUbuntuを再起動するコマンドをDockerfileに記述したい

fukazume

総合スコア78

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/09/03 14:50

編集2020/09/04 01:54

##質問
Docker内のUbuntuを再起動またはログアウト&再ログインをするコマンドをDockerfileやdocker-composeに記述したいです。理由は、グループの追加を反映させるには、一度ログアウトして再ログインしなおす必要があるからです。

アドバイスなど頂けますと、誠にありがたいです。ご不明な点などございましたら、適宜追記していまいりますので、どうぞよろしくお願い申し上げます。

Dockerfile

1FROM ubuntu:18.04 2 3RUN apt-get update -y && \ 4 apt-get upgrade -y && \ 5 apt-get install -y sudo && \ #ご指摘を受け追記 6 apt-get install -y docker.io --fix-missing && \ 7 apt-get install -y docker-compose --fix-missing 8 9ENV USER tester 10ENV HOME /home/${USER} 11ENV SHELL /bin/bash 12 13# 一般ユーザーアカウントを追加 14RUN useradd -m ${USER} 15# 一般ユーザーにsudo権限を付与 16RUN gpasswd -a ${USER} sudo 17# 一般ユーザーのパスワード設定 18RUN echo "${USER}:test_pass" | chpasswd 19# dockerグループに$USERを追加 20RUN sudo usermod -aG docker $USER

<背景>
【y_shinodaさんのご依頼により追記】
当初Selenium公式のdocker-seleniumに紹介されていたStandalone用(Chrome版)コマンド「docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:4.0.0-alpha-7-prerelease-20200826」をWinコマンドプロンプト上で実行したところ、エラー「docker: Error response from daemon: error while creating mount source path '/dev/shm': mkdir /dev/shm: file exists.」が発生しました。とりあえずSeleniumを動作させたくて他のサンプルプログラムを探したところ、Qiita投稿: Docker上でSeleniumとHeadless ChromeとPython3を動かすを発見し、dind環境でなくても良い気がしましたが、Windows上にDockerのUbuntuコンテナがあったのでここで試してみようと考えたのが発端です。rootユーザーでも他ユーザーを作成してこのプログラムを実行してもエラー※「Couldn’t connect to Docker daemon」が出てハマったという経緯となります。
【追記ここまで】

以下の解決手順を試しているときに、最下行のusermodコマンド結果を反映するにはOS再起動が必要だと知ったので。

DockerでCouldn’t connect to Docker daemonが出る場合の原因と解決方法
https://www.virment.com/how-to-fix-couldnt-connect-to-docker-daemon/

<追記>
質問後、同dind環境から "docker run -it --privileged イメージ名" でコマンド実行を試しても同エラーが発生しました。

##環境
Windows 10
Docker Desktop v2.3.0.4(46911)D
Docker Engine v19.03.12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_shinoda

2020/09/03 16:01

Ubuntu のコンテナーを root 権限で実行したときのどのような不都合を解消したいのかを 質問欄に追記お願いします
fukazume

2020/09/04 00:54

ご関心いただきまして誠にありがたく存じます。<背景>項目に追記しましたのでご確認いただけるとありがたいです。dind環境でさらなる深みにハマってる感もあるので、今一度熟考し、Windows上のDockerでSeleniumをシンプルに最小構成で実行できる環境を構築したいです。どうぞよろしくお願い申し上げます。
guest

回答1

0

ベストアンサー

前提として、 Dockerfile に書く RUN 命令とは、Docker イメージ構築時に自動実行する中間コンテナで自動実行するものです。そのため、 Dockerfile ではログアウトや再ログインという概念はありません。

そのため

理由は、グループの追加を反映させるには、一度ログアウトして再ログインしなおす必要があるからです。

こちらの作業は不要です。

次に、解決されたいのは Couldn’t connect to Docker daemon というエラーに対してだと思いますが、そもそも Docker コンテナ内から Docker デーモンに対しては、デフォルトのままでは通信できません。

理由は、コンテナ内のプロセス空間やファイルシステムからホスト側がデフォルトでは見えないからです(正確にはコンテナ内の docker コマンドが、ホスト側、この場合は Docker Desktop を動かしている仮想マシン上の /var/run/docker.sock にアクセスできないため、コンテナ内で docker コマンドを実行しても、このようなエラーが出ています)。

純粋にこのエラーを解消されたいのであれば2つ対策があります。

1つは、「Docker in Docker」などで検索し、コンテナ内からホスト側の Docker を操作する手段を検討いただく方法。

もう1つは、最終的にこの Dockerfile もしくは Docker で何を達成されたいかを再検討・明確化し、その達成内容を質問事項に記載いただく方法です(たとえばテスト環境を構築したい、CI環境に用いたい…等々)。

ちなみに、記載された Dockerfile にある ubuntu:18.04 イメージには sudo コマンドがありませんので、これで build しようとしてもエラーになります。

いきなり Dockerfile を書きはじめるより、まず docker run -it ubuntu:18.04 bash を実行し、コンテナ内でコマンドが実行できるかや、やりたいことが実現できているかを確認されることをお勧めします。

投稿2020/09/03 19:53

zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukazume

2020/09/04 01:39

ご解説いただきありがとうございます!おっしゃるとおりです。エラーを近視眼的に追っていった末のdind環境でのdocker-compose up実行によるエラー「Couldn’t connect to Docker daemon」遭遇という現状です。sudo未インストールの件もご指摘ありがとうございます!追記にて修正いたしました。 ちなみに同dind環境から "docker run -it --privileged イメージ名" でコマンド実行を試しても同エラーが発生しました。 もともとは「Windows上のDockerのUbuntuコンテナでSeleniumプログラムを実行する」というのが当初の目標だったのですが前述の通り複雑になってしまいました。いま対策2を主軸に方法の再検討をしておりますが、もし対策1が複雑でも実現まで7,8合目まで既に到達できているのであればこちらで実現できる方法も知識として知りたい、という思いもあります。仮に、ご提示いただいた対策1では、現状のdind環境からSeleniumプログラムを実行できるまでの工程/作業内容は多くなりますでしょうか?
zembutsu

2020/09/05 03:15

Seleniumに関しては私は分からないのですが、公式のDockerイメージやDocker Compose用ファイルが公開されていました。https://github.com/SeleniumHQ/docker-selenium こちらをご覧になって、進められるのが一番簡単そうな気もします。
fukazume

2020/09/06 00:06 編集

引き続きのご回答ありがとうございます!docker-seleniumは質問以前から試していたのですがそこでも数々のエラーが発生しておりました。おかげさまで1つずつエラーを回避し、なんとかWSL上でもdocker-seleniumが動作するように設定できました。論理的に順序立てられた丁寧のご解説は本当に勉強になりました!改めて深く感謝申し上げます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問