web-dev-qa-db-ja.com

Dockerコンテナーのコードを更新する方法

Docker Djangoコンテナをセットアップし、チュートリアルを使用してビルドを使用してイメージを作成しました here 。チュートリアルでは、基本的なDjangoアプリケーションを "/ code"にマウントします。データボリュームに含まれています。

ただし、このコードをどのように更新および開発し、それを出荷/展開できるようになるかを理解したいと思います。私がコミットするとき、それはデータボリュームの一部であるため、コードの変更は考慮されません。

Djangoコードを画像の一部にしたり、更新されたコードで画像を更新したりする方法はありますか?

15
bilalba

質問に答えるのは遅すぎると思いますが、手を差し伸べる人にとっては有益かもしれません。

あなたが言及したチュートリアルは、初心者には少し扱いに​​くいので、構造を少し変更します。画像を公開する目的で、DockerhubなどのDockerレジストリアカウントを持っていると思います。これは、リモートホスト上のイメージにアクセスする場合に必要です(実際のイメージファイルをコピーできますが、お勧めしません)。

プロジェクトを作成する

Django=でWebサイトを作成し、それをドッキングする場合を想定します。まず、次のようにします。

Django-admin startproject samplesite

以下を含むディレクトリsamplesiteを作成します(requirements.txtを追加しました)。

db.sqlite3  manage.py  requirements.txt  samplesite

dockerfileとdocker-compose.ymlを追加する

ご覧のとおり、Dockerfileの場合、Dockerfileと比較して何も変更されていません。

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

ただし、docker-compose.ymlの場合:

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    image: yourUserNameOnDockerHub/mywebsite:0.1  # this line is added
    command: python manage.py runserver 0.0.0.0:8000
    #volumes:
    #  - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

docker-compose.ymlもチュートリアルで説明したものとほとんど同じですが、ボリュームがコメント化され、1行がimage: mywebsite:0.1が追加されています。この行により、ビルドされたイメージを追跡し、いつでもデプロイできます。ボリュームのマウントではない作成したコードに関連し、そこに入れられてテイクアウトによって変更された動的コンテンツDjango(sqlite、アップロードされたファイルなど)。

ビルドして実行

ただし、最初にdocker-compose upを実行した場合、新しい行が追加されているため、すべてが正常に機能するため、2回目以降にコードを変更すると、実行したコンテナに変更が反映されません。これは、各docker-compose upに対して、composeがmywebsite:0.1(すでに存在する)を検索し、新しいイメージを構築せず、古いイメージに基づいてコンテナーを作成するためです。イメージを公開/展開するにはそのイメージ名とタグが必要なので、代わりに次を使用する必要があります。

docker-compose up --build

変更が反映されたイメージが再構築されます。変更を加えるたびにそれを実行し、で表示できる新しい新しい画像を作成します(名前とタグは変更されていませんが、画像IDを変更すると、これが新しい画像であることを示します)。

$ docker images
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
yourUserNameOnDockerHub/mywebsite            0.1                 033c9d2bfac0        7 seconds ago       974MB

公開と展開

Dockerhub(またはその他のレジストリ)にアカウントを設定している場合は、後で使用するためにイメージを公開したり、リモートサーバーにデプロイしたりできます。

docker Push yourUserNameOnDockerHub/mywebsite:01 

これをリモートホストにデプロイし、docker-composeを再度使用する場合は、docker-compose.ymlを次のように変更します。

version: '3'

services:
  db:
    image: postgres
  web:
    image: yourUserNameOnDockerHub/mywebsite:0.1 
    command: python manage.py runserver 0.0.0.0:8000
    #volumes:
    #  - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

build: .行が削除されていることに注意してください(実行するだけなので)。ローカルで開発する場合、docker-compose up --buildを実行するたびに、新しいイメージが作成およびタグ付けされ、それに基づくコンテナーが構成スタックで実行されます。変更に満足していると思われる場合は、公開手順に従ってサーバーに公開します。

0
Farzad Vertigo

イメージを更新する場合、たとえばアプリケーションコードの変更により、イメージのビルド中にCOPYを使用するため、Dockerfileでは次のようにします

COPY /you/code/on/the/Host /var/www

「ボリューム」とイメージ作成に関する私の回答も参照してください https://stackoverflow.com/a/39314602/3625317 ビルドでコードが欠落している理由を明確にする

0
Eugen Mayer