web-dev-qa-db-ja.com

開発中のDockerコンテナーのコードを編集する方法

コンテナの/srvの下にすべてのWebサイトのコードがあります。

Dockerfileはgitを使用してコードをダウンロードし、本番環境への展開を容易にするためにイメージの一部にします。

しかし、その後、開発中のコードをどのように編集しますか?ボリュームを使用することが解決策だと思いました。例:-v /docker/mycontainer/srv:/srv。ただし、コンテナ内のディレクトリは上書きされます。初めて実行する場合は、ホストに何もないので空にします。そのため、Dockerfileで行ったことはすべて失われました。

/srv/myapp内には、アプリのさまざまなバージョンで共有したいディレクトリとファイルもあります。例:/srv/myapp/user-uploads。これは、プロフェッショナルなWeb開発における 一般的な慣行 です。

これらすべてを実行できるようにするにはどうすればよいですか?

  • 開発中の/ srvのコードを編集
  • 異なるバージョン間で/ srv/myapp/user-uploadsを共有します
  • dockerfileにコードをダウンロードさせます。私の意見では、Dockerの外で「git clone」または「git pull」を実行すると、Dockerの目的が無効になります。データベースの移行や他のアプリ固有のスクリプトなど、ホストで実行できないものもあります。

ボリュームを逆方向にマウントする方法はありますか?つまり、反対ではなく、コンテナーでホストを上書きします。

解決策の1つは、コンテナのデーモンを実行する前に/ srvを/srv.deployment-copyにコピーすることだと考えています。そして、デーモンを実行するときに/srv.deployment-copyが存在するかどうかを確認し、すべてを/ srvにコピーして戻します。このようにして、/ srvをボリュームとして使用し、Dockerfileを使用してコードを展開できます。既にすべてのdockerコマンドにエイリアスを使用しているため、これを自動化しても問題はありません。どう思いますか?

60
ChocoDeveloper

開発中のコードを編集する最良の方法は、通常どおりすべてをインストールすること(アプリのリポジトリのクローンを含む)であるが、コンテナ内のすべてのコードを/srv/myapp.deploy.devと言うように移動することです。次に、/srv/myapprwボリュームと、そのボリュームをクリーンアップし、次のように新しいコンテンツをコピーするinit.dスクリプトを使用して、コンテナーを開始します。

rm -r /srv/myapp/*
rm -r /srv/myapp/.[!.]*
cp -r /srv/myapp.deploy.dev/. /srv/myapp
rm -r /srv/myapp.deploy.dev
13
ChocoDeveloper

別のコンテナのボリュームでコンテナを起動する別の方法があります。

https://docs.docker.com/userguide/dockervolumes/ を見てください
データボリュームコンテナの作成とマウント

コンテナ間で共有する永続データがある場合、または非永続コンテナから使用する場合は、名前付きデータボリュームコンテナを作成し、そこからデータをマウントすることをお勧めします。

共有するボリュームを持つ新しい名前付きコンテナを作成しましょう。

$ Sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

その後、-volumes-fromフラグを使用して、/ dbdataボリュームを別のコンテナーにマウントできます。

$ Sudo docker run -d --volumes-from dbdata --name db1 training/postgres

そしてもう一つ:

$ Sudo docker run -d --volumes-from dbdata --name db2 training/postgres

ボリュームで実行できるもう1つの便利な機能は、それらをバックアップ、復元、または移行に使用することです。これを行うには、--volumes-fromフラグを使用して、次のようにそのボリュームをマウントする新しいコンテナーを作成します。

$ Sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

==============

ホストディレクトリのコンテナへのマウントは使用すべきではないと思います。ただし、すべての機能を備えたボリュームを使用できます。完璧なエディターとツールのセットを備えた他のコンテナーを使用して、ボリューム内のファイルを編集できます。このコンテナはオーバーヘッドなしでクリーンになります。

構造は次のとおりです。
-)アプリデータのコンテナ
docker run -d -v /data --name data
-)アプリバイナリのコンテナ
docker run -d --volumes-from data --name app1
-)エディタおよび開発用ユーティリティのコンテナ
docker run -d --volumes-from data --name editor

13
Mikl

注:-vを使用して、コンテナディレクトリをホストディレクトリにmountすることはできません。

/ srvと/srv.deployment-copyをマングルする必要はないと思います。もし、あんたが

私は思う:

  • 永続的/共有データにボリュームを使用する必要があります:-v /hostdir/user-uploads:/srv/myapp/user-uploads、または data volume container conceptを使用できます。これを考慮することができますファイルシステムでバックアップされたデータベースはホスト(データのみのコンテナー)に格納され、コンテナーは-vによって使用を許可されます。

  • 正解です。プロダクションデプロイメントの場合、ソースコード(git clone)でイメージをビルドできます。リリースごとにイメージをビルドします。本番環境でソースコードを編集する必要はありません。

  • 開発環境-ソースコードなしでイメージをビルドするか、展開/開発に同じイメージを使用する場合は、ソースコードディレクトリをボリュームでシャドウする必要があります。次に、ソースコードをローカルでgit cloneし、ボリューム-v /hostdir/project/src:/srv/projectを使用して、ソースコードをコンテナと共有します。できれば、ソースコードを読み取り専用(最後に:ro)で共有し、一時ファイルまたは中間ファイルをコンテナ内の別の場所に保存することをお勧めします。サービスを開始する前に、コンテナの起動時に実行されるセットアップスクリプト(データの移行、インデックス/キャッシュデータファイルの再構築など)があります。したがって、新鮮なre-initが必要だと感じるときはいつでも、devコンテナを強制終了して、再度実行します。または、古いコンテナを停止せず、別のコンテナを実行するだけです。

6
Jiri

私はちょうどgitを使用してこれを行う素敵な方法を見つけました:

CONTAINER=my_container
SYNC_REPO=/tmp/my.git
CODE=/var/www

#create bare repo in container
docker exec $CONTAINER git init --bare $SYNC_REPO

#add executable syncing hook that checks out into code dir in container
printf "#!/bin/sh\nGIT_WORK_TREE=$CODE git checkout -f\n" | \
docker exec -i $CONTAINER bash -c "tee $SYNC_REPO/hooks/post-receive;chmod +x \$_"

#use git-remote-helper to use docker exec instead of ssh for git
git remote add docker "ext::docker exec -i $CONTAINER sh -c %S% $SYNC_REPO"

#Push updated local code into docker
git Push docker master

コードにローカルgitがあると仮定します。 Gitはコンテナにインストールする必要があります。あるいは、おそらくdocker runと、gitがインストールされた共有ボリュームを持つデータコンテナーを使用できます。

5
till

Gitがコンテナのエントリポイントではないと仮定すると、gitがdockerコンテナにインストールされている場合、コンテナにsshしてgit clone/git pullを実行できます。ボリュームがホストと共有される方法のため、コンテナからファイルに加えられた変更はホストにも行われます(実際には同じファイルです)。

ここ は、コンテナにすばやくsshする方法の説明です。

2