docker-compose run

読む時間の目安: 2 分

Usage:
    docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
        SERVICE [COMMAND] [ARGS...]

Options:
    -d, --detach          Detached mode: Run container in the background, print
                          new container name.
    --name NAME           Assign a name to the container
    --entrypoint CMD      Override the entrypoint of the image.
    -e KEY=VAL            Set an environment variable (can be used multiple times)
    -l, --label KEY=VAL   Add or override a label (can be used multiple times)
    -u, --user=""         Run as specified username or uid
    --no-deps             Don't start linked services.
    --rm                  Remove container after run. Ignored in detached mode.
    -p, --publish=[]      Publish a container's port(s) to the host
    --service-ports       Run command with the service's ports enabled and mapped
                          to the host.
    --use-aliases         Use the service's network aliases in the network(s) the
                          container connects to.
    -v, --volume=[]       Bind mount a volume (default [])
    -T                    Disable pseudo-tty allocation. By default `docker-compose run`
                          allocates a TTY.
    -w, --workdir=""      Working directory inside the container
利用方法:
    docker-compose run [オプション] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
        SERVICE [COMMAND] [ARGS...]

オプション:
    -d, --detach          コンテナーをバックグラウンドで実行し、実行された新たな
                          コンテナー ID を表示します。
    --name NAME           コンテナーに対して名前を割り当てます。
    --entrypoint CMD      イメージのエントリーポイントをオーバーライドします。
    -e KEY=VAL            環境変数を設定します。(複数指定が可能)
    -l, --label KEY=VAL   ラベルを追加またはオーバーライドします。(複数指定が可能)
    -u, --user=""         指定されたユーザーまたは UID によりコマンドを実行します。
    --no-deps             リンクされているサービスは起動しません。
    --rm                  終了時にコンテナーを削除します。デタッチモードでは無視されます。
    -p, --publish=[]      ホストに対してコンテナーのポートを公開します。
    --service-ports       サービスポートを有効にしホストへのマップを行ってコマンドを実行します。
    --use-aliases         コンテナーが接続するネットワークにおいて、サービスネットワークの
                          エイリアスを利用します。
    -v, --volume=[]       ボリュームをバインドマウントします。(デフォルト: [])
    -T                    擬似 TTY への割り当てを無効にします。デフォルトにおいて
                          `docker-compose run` には TTY が割り当てられます。
    -w, --workdir=""      コンテナー内のワーキングディレクトリを指定します。

1 つのサービスに対して、1 コマンドだけ実行します。 たとえば以下のコマンドはwebサービスを起動して、コマンドとしてbashを実行します。

docker-compose run web bash

runによって指定したコマンドは、定義されたサービス設定に基づいて生成された新たなコンテナー内において実行されます。 定義内容にはボリューム、リンクなどその他の項目も含みます。 ただしコマンド実行には大きな違いが 2 つあります。

1 つは、runによって指定されたコマンドは、サービス設定において定義されたコマンドをオーバーライドするということです。 たとえばwebサービスが、bashコマンドを実行するように設定されているとします。 これに対してdocker-compose run web python app.pyを実行すると、コマンドはオーバーライドされてpython app.pyとなります。

2 つめの違いはdocker-compose runコマンドを実行した場合、サービス設定においてポートが指定されていてもポート生成は行わない点です。 これによりすでに開いているポートとの間での衝突が回避されます。 サービスポートを生成してホストへマッピングされて欲しい場合には--service-portsフラグを指定します。

docker-compose run --service-ports web python manage.py shell

別の方法として--publishまたは-pオプションを使って手動によるポートマッピングが指定できるので、docker runの実行時に以下のようにすることもできます。

docker-compose run --publish 8080:80 -p 2022:22 -p 127.0.0.1:2021:21 web python manage.py shell

リンクが設定されているサービスを起動すると、runコマンドの実行においては、まずそのリンクサービスが実行されているかどうかがチェックされ、停止中であった場合にはそれを起動します リンクサービスがすべて起動したら、指定されたコマンドが実行されます。 たとえば以下のようなコマンドを実行したとします。

docker-compose run db psql -h db -U docker

上のコマンドはリンクされているdbコンテナーにおいて PostgreSQL の対話シェルを開きます。

runコマンド実行にあたってリンクコンテナーを起動したくない場合は--no-depsフラグを指定します。

docker-compose run --no-deps web python manage.py shell

コンテナーの再起動ポリシーをオーバーライドして実行していて、終了後はコンテナー削除を行いたい場合には--rmフラグを指定します。

docker-compose run --rm web python manage.py db upgrade

上のコマンドはデータベースのアップデートスクリプトを実行します。 そして終了時にはコンテナーを削除します。 サービス設定において再起動ポリシーが設定されていても、その設定は無視されます。

fig, composition, compose, docker, orchestration, cli, run