2

バックグラウンド:

docker を使用して python-web(django) 環境をデプロイしています。

そして、ランタイム環境のみを含み、ソースコードを含まないクリーンな docker イメージを作成し、コードをボリュームインしたいと考えています。

私のドッカー イメージ リポジトリ: https://github.com/EaseCloud/docker-django

FROM python:latest
MAINTAINER huangwc@easecloud.cn

WORKDIR /var/app

ENV PROJECT=app

RUN apt-get update && apt-get upgrade -y && apt-get autoremove -y

RUN pip install --upgrade pip && \
    pip install gunicorn django greenlet eventlet

COPY ./startup.sh /var
RUN chmod +x /var/startup.sh

VOLUME ["/var/app", "/var/app/media"]

EXPOSE 8000

CMD ["/var/startup.sh"]

startup.shそのため、コマンドを使用してスクリプトを実行していますCMD

スクリプトの内容は次のとおりです。

#!/bin/bash
set -e
if [ ! -e ./manage.py ]; then
    django-admin startproject $PROJECT .
fi
if [ -f ./requirements.txt ]; then
    pip install -r requirements.txt
fi
gunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgi

スクリプトでは、次のことを行います。

  1. ソースボリュームがない場合は、django プロジェクトを開始してみてください。
  2. PyPI 要件を にインストールしrequirements.txtます。
  3. gunicorn サービスを開始します。

質問:

さて、通常は を含むソース コードをボリューム化するrequirements.txtため、異なる Docker コンテナー インスタンスでは異なる PyPI 要件が存在する可能性があります。

私は行を作りたい:

pip install -r requirements.txt

を呼び出したときにのみ実行しますdocker run:

docker run --name myproject \
    -v /var/django/myproject:/var/app \
    -e PROJECT=myproject \
    huangwc/django

しかし、私が呼び出したときにコマンドを実行したくありません:

docker start myproject

これを行う良い解決策はありますか?

4

1 に答える 1

1

マットのコメントを少し拡張し、スクリプトに基づいて理解しているので、最終的な目標を達成するための別のアイデアを追加します。

アイデア #1: 開発環境変数を設定する

起動スクリプトを次のように変更すると、特定のコンポーネントを実行するかどうかを制御できます。

#!/bin/bash
set -e
if [ $DEVELOPMENT ]; then
  if [ -f ./requirements.txt ]; then
      pip install -r requirements.txt
  fi
  if [ ! -e ./manage.py ]; then
      exec django-admin startproject $PROJECT .
  fi
else
  exec gunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgi
fi

次に、開発環境でコンテナーを実行するときに、DEVELOPMENT環境変数をtrueまたはその他のテキストに設定します。これがないと (デフォルトで)、コンテナーは gunicorn を起動し、すべての依存関係が存在し、イメージにビルドされたものにコードがマウントされていないと想定します。

アイデア 2: Out アクションを分離する

私は、デフォルトで実行されたときに「機能する」イメージの大ファンです。そのため、デフォルトでイメージがすべてのコードと依存関係を (ビルド プロセスから) 既にビルドされていることを規定できる場合。次に、結果CMDgunicorn -b 0.0.0.0:8000 -w 4 -k eventlet $PROJECT.wsgiこれを行うのに十分なはずです。

次に、開発側では、CMDatdocker runのようなもので手動でオーバーライドするように指示するだけpip install -r requirements.txt && django-admin startproject $PROJECT .です。役立つ場合は、別のスクリプトにすることもできますdev.sh:

#!/bin/bash
set -e
pip install -r requirements.txt
exec django-admin startproject $PROJECT .
于 2016-03-05T23:19:59.570 に答える