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

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

ただいまの
回答率

90.35%

  • Docker

    900questions

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

  • docker-compose

    198questions

[Docker][docker-compose] docker-compose.yml内で、ベースになるimageに対して別のDockerfileを実行することは可能か

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 108

kk123

score 124

 聞きたいこと

docker-compose.ymlとDockerfileで以下のようなことが実現可能か確認させてください。

  1. 基本となるベースのDockerイメージを作成(CentOS6ベース、yum updateやdatetimeの変更を実施。Baseイメージとする)
  2. Baseイメージ上にmysqlをインストールしたmysqlイメージ、Apacheをインストールしたapacheイメージを作成するが、mysql・apcheインストールの処理を別途Dockerfileに書き出す。
  3. 上記をmysql => apacheの順番で起動する

以上です。。。よろしくお願い致します。

(2018/11/13 追記)
すいません質問の内容が自分で後から見返してみても、自分の聞きたいことと乖離があったので再度質問させてください。。。

ローカルのDockerイメージ(例:Baseイメージ)に対して、別のDockerfileで定義した処理を実行し、再度別のイメージを作成するこをdocker-composeで管理することは可能でしょうか?

例えば、下のようなdocker-compposeがあるとします。

version: "3.3"

services:
    db:
        image: base_ubuntu18
        container_name: db
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}

    web:
        image: base_ubuntu18
        container_name: web

    nas:
        container_name: nas
        image: base_ubuntu16

:


上記の場合、コンテナ名db、web、nasの大元になるイメージがそれぞれbase_ubuntu18、base_ubuntu16になっています。
(base_ubuntu18, base_ubuntu16にはweb, mysqlなどはインストールされていません)
base_ubuntu18、base_ubuntu16に対して、

  • web用のセットアップのDockerfile
  • mysql用のセットアップのDockerfile
  • nas用のセットアップのDokerfile

などを定義して、docker-composeに組み込むことは可能でしょうか?

すいませんが、よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

 1.2.の回答

  • imageの下準備をする(例:apt-get update -y)
  • コンテナを終了させる
  • commit しimage化する
C:\>docker run -it --name base-ubuntu ubuntu:latest bash
root@3139ee1b1c95:/# apt-get update -y

## アップデートログは省略

Fetched 15.0 MB in 1min 5s (230 kB/s)
Reading package lists... Done
root@3139ee1b1c95:/# exit     ← コンテナを抜ける

C:\>docker commit base-ubuntu base
sha256:da270ddce8dcac0b5c36ae0a8b0f6652f6c5d7f1f0d5a7c8f1e7cb998ada43c7
  ↑baseの作成

C:\>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
base                latest              da270ddce8dc        24 seconds ago      110MB ←新しくできたimage
ubuntu              latest              ea4c82dcd15a        3 weeks ago         85.8MB

上記ではupdateされたubuntuのbaseイメージが作成されるので、これを元にmysql・apacheのDockerfileを作成すれば良いと思います.

 3の回答

docker-composeを使用し、linkなどの設定を行っても起動コンテナの順番は最下層から行ってくれます。
この場合はmysqlコンテナ→apacheコンテナの順番

しかし、起動順を厳守するだけであり、mysqlコンテナがサービス開始状態にならない状態で、apacheが起動してしまい、エラー等が発生するおそれがあります。

物理的な2台のマシンで例えると、mysql PCの電源を入れ、apache PCの電源を入れてもmysql PCの起動が遅く、apache PCのサービスが開始されてしまうみたいな感じです。

サービスの起動順を厳守したい場合には、シェルにて対象のコンテナが起動されているか確認します。公式にサンプルがあります。

公式のサービスはpostgresが起動しているか判断し、起動していなかったらsleepをするシェルです。

https://docs.docker.com/compose/startup-order/

 追記

下記のようなディレクトリ構成にします。

docker-compose.yml
 + 「mysql」という名前のフォルダ
    + Dockerfile ←mysqlを構築するDockerfile
 + 「apache」という名前のフォルダ
    + Dockerfile ←apacheを構築するDockerfile

docker-compose.yml のbuild対象をディレクトリ指定すれば、その配下のDockerfileでコンポーネントが走ります。ただし、上位のディレクトリは参照できません。docker-compose.ymlファイル配下にフォルダを作成してして、その内部にDockerfileを作成してください。

version: '3'

services:
  database :
    build: ./mysql
いろんな設定
  app :
    build: ./apache

複数のコンテナを同時に起動するにはdocker-compose up -dを叩けば良いです。

docker-compose up -d

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/13 10:26

    ご回答ありがとうございます!
    すいません、、、自分で質問を見返して見たら、自分の聞きたいことと実際に聞いていることに乖離がありました。。。
    Baseイメージはローカルに存在している状態で、そこからdocker-composeにて、
    * mysql(apache, など)用のイメージの作成(Dockerfileにmysqlインストール用の定義を記載。それをdocker-compose内で利用する)
    * それらイメージからコンテナ起動
    などを定義することはできるでしょうか?

    キャンセル

  • 2018/11/13 11:21

    コードがあるので追記します。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Docker

    900questions

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

  • docker-compose

    198questions

  • トップ
  • Dockerに関する質問
  • [Docker][docker-compose] docker-compose.yml内で、ベースになるimageに対して別のDockerfileを実行することは可能か