Compose: 以前のボリュヌムを再利甚せずに `docker-compose up--force-recreate`する方法

䜜成日 2015幎10月02日  Â·  23コメント  Â·  ゜ヌス: docker/compose

docker-compose1.4.2およびdocker1.8.2を䜿甚
以䞋に、最初のボリュヌムe583c6a8 ... 5a93788a0が再利甚されおいるこずがわかりたす。

 $ sudo docker-compose up -d --force-recreate
   Recreating remotetransmission_torrent_1...

 $ docker inspect remotetransmission_torrent_1 | grep volumes
   "/mnt/docker/volumes/e583c6a87437a5b4b1af50ee2693bd3e5dce574ec72d60dce1311215a93788a0/_data:/home/transmission/.config/transmission-daemon:rw",
   "/mnt/docker/volumes/cefce79850d7162f4f99541559c2dfc7315c83db717a7a5953118bd3c4b273e0/_data:/home/transmission/Downloads:rw"
   "Source": "/mnt/docker/volumes/e583c6a87437a5b4b1af50ee2693bd3e5dce574ec72d60dce1311215a93788a0/_data",
   "Source": "/mnt/docker/volumes/cefce79850d7162f4f99541559c2dfc7315c83db717a7a5953118bd3c4b273e0/_data",

 $ sudo docker-compose up -d --force-recreate
   Recreating remotetransmission_torrent_1...

 $ docker inspect remotetransmission_torrent_1 | grep volumes
   "/mnt/docker/volumes/e583c6a87437a5b4b1af50ee2693bd3e5dce574ec72d60dce1311215a93788a0/_data:/home/transmission/.config/transmission-daemon:rw",
   "/mnt/docker/volumes/cefce79850d7162f4f99541559c2dfc7315c83db717a7a5953118bd3c4b273e0/_data:/home/transmission/Downloads:rw"
   "Source": "/mnt/docker/volumes/e583c6a87437a5b4b1af50ee2693bd3e5dce574ec72d60dce1311215a93788a0/_data",
   "Source": "/mnt/docker/volumes/cefce79850d7162f4f99541559c2dfc7315c83db717a7a5953118bd3c4b273e0/_data",

新しいボリュヌムを䜜成するために、 stop 、次にrmを匷制されたす

 $ sudo docker-compose stop 
   Stopping remotetransmission_torrent_1... done

 $ sudo docker-compose rm
   Going to remove remotetransmission_torrent_1
   Are you sure? [yN] y
   Removing remotetransmission_torrent_1... done

 $ sudo docker-compose up -d --force-recreate
   Creating remotetransmission_torrent_1...

 $ docker inspect remotetransmission_torrent_1 | grep volumes
   "Source": "/mnt/docker/volumes/c5bb9a8f7b68c762c42e9c0ee92afbca3aa0d7ff9d09aaf45fd260f6fc663ec9/_data",
   "Source": "/mnt/docker/volumes/9dcce8440bafc8893e07352111d1aefb625c36df10da6dc4eaa593220266ea31/_data",

_
stop/rm方法よりも良い方法はありたすか

areup kindocs kinquestion

最も参考になるコメント

このポリシヌは、Dockerのベストプラクティスに違反しおいるようであり、コンテナヌの再䜜成が状態をリヌクしおいた理由のトラブルシュヌティングに倚くの頭痛の皮を匕き起こしたした。 dockerに再䜜成するように指瀺した堎合、それは「コンテナヌの実行党䜓で䞀郚のデヌタを保持するが、コンテナヌ内のプロセスを再開する」ずいう意味ではありたせん。 それは地球を舗装しお最初からやり盎すこずを意味したす。 ボリュヌムを保存したい堎合は、明瀺的にボリュヌムをマりントしたす。 自動マりントされたボリュヌムがコンテナの実行党䜓で持続するこずは決しお期埅しおいたせん。

党おのコメント23件

stop/rmが正しい方法です。 ボリュヌム内のデヌタは重芁である可胜性があるため、誀っお削陀しないようにする必芁がありたす。

おそらくこれをもう少しよく文曞化するこずができたす。

このポリシヌは、Dockerのベストプラクティスに違反しおいるようであり、コンテナヌの再䜜成が状態をリヌクしおいた理由のトラブルシュヌティングに倚くの頭痛の皮を匕き起こしたした。 dockerに再䜜成するように指瀺した堎合、それは「コンテナヌの実行党䜓で䞀郚のデヌタを保持するが、コンテナヌ内のプロセスを再開する」ずいう意味ではありたせん。 それは地球を舗装しお最初からやり盎すこずを意味したす。 ボリュヌムを保存したい堎合は、明瀺的にボリュヌムをマりントしたす。 自動マりントされたボリュヌムがコンテナの実行党䜓で持続するこずは決しお期埅しおいたせん。

ボリュヌムを䜿甚する唯䞀の理由は、実行間でデヌタを氞続化するこずです。 氞続化されたデヌタが必芁ない堎合、なぜそれをボリュヌムに入れるのですか

ボリュヌムを蚭定しおいたせん。 docker-compose.ymlはボリュヌムが蚭定されおおらず、ボリュヌムを接続するためにdocker-compose.ymlに䜕も枡しおいない。

コマンド

docker-compose up --force-recreate --abort-on-container-exit --build foo

docker-compose.yml

version: '2'
services:
  foo:
    build:
      context: .
      dockerfile: src/integration/foo/Dockerfile
    ports:
      - "3306:3306"
      - "33060:33060"

Dockerfile

FROM mysql:5.7

COPY schema/foo/migration.sql /data/db_schema.sql
COPY src/integration/foo/create_test_db.sh /docker-entrypoint-initdb.d/create_test_db.sh
ENV MYSQL_ALLOW_EMPTY_PASSWORD true

EXPOSE 3306 33060

create_test_db.sh

#!/bin/bash
set -e
mysql --no-defaults -u root -e "drop database if exists agent_state; create database foo"
mysql --no-defaults -u root foo < "/data/db_schema.sql"

䞊蚘を実行した堎合は、DBに䜕かを曞き蟌み、次にSIG_INTを曞き蟌んでから、コマンドを再床実行したす。DBに入力したデヌタは、実行䞭も保持されたす。

これはMySQLむメヌゞの問題です。 ベヌスにボリュヌムを䜜りたす
画像。 別のMySQLを䜿甚するこずで、問題を回避できたす。
画像たたは堎合によっおは、デヌタに別のパスを䜿甚するように匷制したす。

2016幎10月19日18:36、「MicahZoltu」 [email protected]は次のように曞いおいたす。

ボリュヌムを蚭定しおいたせん。 私のdocker-compose.ymlには䜕もありたせん
ボリュヌムがセットアップされ、docker-compose.ymlに䜕も枡されおいたせん
ボリュヌムを接続したす。

コマンド

docker-compose up --force-recreate --abort-on-container-exit --build foo

docker-compose.yml

バヌゞョン「2」
サヌビス
foo
ビルド
環境 。
dockerfilesrc / Integration / foo / Dockerfile
ポヌト
-「33063306」
-「3306033060」

Dockerfile

mysql5.7から

スキヌマ/foo/migration.sql/data/db_schema.sqlをコピヌしたす
コピヌsrc / Integration / foo / create_test_db.sh /docker-entrypoint-initdb.d/create_test_db.sh
ENV MYSQL_ALLOW_EMPTY_PASSWORD true

EXPOSE 3306 33060

create_test_db.sh

/ bin / bash

セット-e
mysql --no-defaults -u root -e "存圚する堎合はデヌタベヌスを削陀したすagent_state;デヌタベヌスfooを䜜成したす"
mysql --no-defaults -u root foo <"/ data / db_schema.sql"

䞊蚘を実行する堎合は、DBに曞き蟌み、次にSIG_INTを曞き蟌み、次に
DBに入力したデヌタは、実行䞭も保持されたす。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/docker/compose/issues/2127#issuecomment -254986952、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAa_RG_pJj0i-OSCfcBlG__8ToFDtGKMks5q1sWlgaJpZM4GHruC
。

うヌん、これはDockerコンテナの私の理解に違反しおいたす。 ホストにパスを提䟛せずにボリュヌムをマりントするにはどうすればよいですか 私の理解では、ボリュヌムを明瀺的にマりントしない限り、Dockerコンテナヌは䞀時的なものですか

ボリュヌムにはホストパスは必芁ありたせん。 ボリュヌムには次の3皮類がありたす。

  • ホストバむンドマりント -v /host:/container 
  • 名前付きボリュヌム -v name:/container 、 docker volume create 
  • 匿名ボリュヌム -v /container 、たたはVOLUME内のDockerfile 

mysqlむメヌゞは匿名ボリュヌムを䜿甚したす。 実行時に、コンテナヌ内のそのパスに別のボリュヌムを䜿甚するようにコンテナヌに指瀺できたすが、そうでない堎合でも、匿名ボリュヌムはそこにありたす。

匿名のボリュヌムは玠晎らしいものではありたせん。 それらは3぀の䞭で最も叀いものであり、それらの動䜜の倚くは、䞋䜍互換性の理由でのみ保持されるレガシヌなものです。

「--recreate-volumes」ずいうコマンドラむンオプションがあればいいのですが...

OK、みんな、これが考えるべきケヌスです

1Railsパブリックディレクトリをnginxコンテナに再マりントしお、静的なものをnginxから盎接提䟛できるようにしたす。
2「匿名」ホストにマりントされおいない、名前が付いおいないボリュヌムを/ usr / local / app / app / publicに割り圓お、「volumes_from」を介しおnginxず共有したす
3「パブリック」コンテンツは、むメヌゞビルドで倉曎されるこずがよくありたす。トップレベルのファむルだけでなく、サブディレクトリ内の䞀郚のファむルこれは重芁です

珟圚、コンテナを再䜜成するず、叀いバヌゞョンの「public」になっおしたいたす。むメヌゞのコンテンツは単に無芖されたす。 はい、Dockerは䞍足しおいるファむルを匿名ボリュヌムにコピヌするこずに

そのため、「stop-rm-up」シヌケンスを実行するか本番環境ではそれほど䟿利ではありたせん、別のディレクトリを共有ボリュヌムずしお䜿甚し、アプリケヌションコンテナの開始時に明瀺的に「rsync」を呌び出しおデヌタを入力/曎新する必芁がありたす。

匿名ボリュヌムを芪コンテナず䞀緒に移動させる方法があれば、それは倧きな改善になるでしょう。

コヌドたたは静的アセットにボリュヌムを䜿甚しないでください。 ボリュヌムは、デプロむメント間で保持するデヌタ甚です。これは、ここで必芁なものずは逆です。 静的アセットを䜿甚しおnginxむメヌゞを構築するか、静的アセットを含むWebサヌバヌコンテナヌをプロキシしたす。

芖点をありがずう 私はただこの芳点から考えおいたせんでした。

これは、ただ進化しおいるDockerアヌキテクチャの抂念的な問題の1぀であるようです。 これたでのずころ、デヌタボリュヌムの抂念の進化たずえば、「デヌタコンテナ」から「名前付きボリュヌム」ぞが芋られたしたが、おそらくただ完成しおいたせん。

https://docs.docker.com/engine/tutorials/dockervolumes/#/data -volumesを芋るず、説明されおいるほずんどの利点AUFSのバむパス、共有が必ずしもデヌタの氞続性に関連しおいるずは限らないこずがわかりたすどのボリュヌムが元々蚭蚈されおいたか。

したがっお、私を含む人々が本来の目的を超えおさたざたな方法でボリュヌムを䜿甚しようずしおいるのは圓然のこずです。 たずえば、倚くの明瀺的なコピヌを行わずに、䞀時的たたは画像制埡されたデヌタを1぀のコンテナから別のコンテナに共有したす。

倚分い぀か私達はそれをするための䞀貫した暙準的な方法を理解するでしょう。 :)これたでのずころ、䞊蚘のかなり単玔な回避策を䜿甚するこずが可胜です。 理想的ではありたせんが、アヌキテクチャ䞊の期埅が適切に蚭定されおいる限り、蚱容できたす。

もう䞀床、あなたの応答、説明、そしおあなたがしおいる玠晎らしい仕事に感謝したす

私は今日この問題に遭遇したした、ここでの玠晎らしい説明のおかげで、私は間違いなく問題を理解するのに圹立ちたした。

私にずっお倧きな混乱のポむントは、dockerfileのVOLUMEタグによっお、䞀貫性のある匿名ボリュヌムが䜜成されるこずを理解しおいたこずです。 ドキュメントでそれを芋逃したかもしれたせんが、それに぀いおの蚀及を芋぀けるこずができたせんでした。

@dnephin

述べたように@ hleb-rubanau。 RailsずNginxで単䞀のコンテナヌを実行するこずが解決策ですか このようにhttps//docs.docker.com/engine/admin/multi-service_container/

ベストプラクティスに違反する必芁がありたす「各コンテナには1぀の懞念事項のみが必芁です
"資産を提䟛するためだけですか:(

興味のある人のために、私は次のようになりたした

1セットアップでは、垞にバむンドマりント別名ホストマりントボリュヌムを䜿甚しおいたす。 匿名ボリュヌムず名前付きボリュヌムには、考慮に入れるにはあたりにも倚くの特別/明癜/条件付き/䞀貫性のない/暗黙のロゞックがありたす。 はい、それぞれのタむプのラむフサむクルず管理の詳现を理解するのは簡単ですが、これらの無関係な違いをすべお気にしないず、アヌキテクチャに぀いお考える方が簡単であるこずがわかりたした。 分散FSの堎合、Glusterは正垞に機胜したすDockerの芳点からはバむンドマりントされおいたす。

2共有ボリュヌムはバむンドマりントされたものであり、アセットがむメヌゞに保存されおいるディレクトリではありたせん。 開始時゚ントリポむントでロヌカルrsyncを実行しおいるので、むメヌゞのディレクトリのアセットがバむンドマりントされた共有ストレヌゞパスにコピヌ/ rsyncされたす。

ありがずう@ hleb-rubanau

ずにかく、RancherOSのようないく぀かのオヌケストレヌションツヌルがそれらのボリュヌム構成をサポヌトしおいるかどうか、たたはスケヌリングするための正しい方法であるかどうかはわかりたせん。 最埌に、dockerを䜿甚しおデプロむするのはより困難です...

私は匿名のボリュヌムを䜿甚しお、ある時点で孀立したものをクリヌンアップするこずを奜みたす。

これは私のプロダクションレヌルスタックです https 

これはたた、jenkins / jenkinsむメヌゞをテストしおいるずきに、かなりの混乱を匕き起こし、/ usr / share / jenkins / ref内のファむルからの倉曎が既にコピヌされおいるため、それらを尊重しおいたせんでした。

これはかなり予想倖のナヌザヌ゚クスペリ゚ンスです。dockercomposeは、すべおの目的ず目的のために「隠された」ボリュヌムを䜜成しおいたす。 通垞のdocker runを䜿甚するず、毎回新しいボリュヌムを取埗したす。 docker-compose upは䜕も曞かれおいないずいう意味で隠されたボリュヌムなので、画像が䜕をしおいるのかを詳しく知らない限り、掘り䞋げなければなりたせん。

少なくずも_非垞に_、「ボリュヌムxを再䜜成しない」ずいうメッセヌゞを出力しお、将来他の人が䜕が起こっおいるのか疑問に思っお時間を無駄にする必芁がないようにする必芁がありたす。

こんにちは@dnephin 、

sudo rm -rf /var/lib/docker/volumes/aa_dbdatavolに電話したしたが、postgres docker-composeをdocker-compose upできなくなりたした。

この゚ラヌが発生する

デフォルトのドラむバを䜿甚しおネットワヌク「aa_default」を䜜成する
aa_postgres_1を䜜成しおいたす
゚ラヌpostgresの堎合サヌビスpostgresのコンテナを䜜成できたせんそのようなファむルたたはディレクトリはありたせん
゚ラヌプロゞェクトの起動䞭に゚ラヌが発生したした。
デヌモンからの゚ラヌ応答そのようなコンテナはありたせんaa_postgres_1

それを回避するためのアむデアがあるかもしれたせんので、共有しおください。 ありがずうございたした

https://github.com/docker/compose/issues/2127#issuecomment -347152650

フォルダを再䜜成するだけで問題が解決したす。
/var/lib/docker/volumes/aa_dbdatavol/_data

@dnephinに感謝しあなたの答えは初めお完璧に機胜したした。 ムチョスグラシアス。

@dnephinは蚀った

ボリュヌムを䜿甚する唯䞀の理由は、実行間でデヌタを氞続化するこずです。 氞続化されたデヌタが必芁ない堎合、なぜそれをボリュヌムに入れるのですか

コンテナ間でファむルを共有したす。 ボリュヌムを䜿甚せずにそれを行うためのより良い方法はありたすか

「ファむル共有」ずはどういう意味ですか

䞀方のコンテナヌがファむルに曞き蟌み、もう䞀方のコンテナヌがそれらの曞き蟌みを確認するこずを期埅しおいたすか ファむルシステムは通垞、2぀のサヌビス間の適切なむンタヌフェむスではありたせんが、その堎合は、ボリュヌムに曎新を曞き蟌むこずで、サヌビスの1぀にファむルシステムを「管理」させるこずができたす。

「共有」ずは、2぀のコンテナがたたたた同じファむルの䞀郚を読み取るこずである堎合、ボリュヌムは必芁ありたせん。 COPY䜿甚しお䞡方のコンテナにファむルを远加したす。

Docker version 18.06.1-ce, build e68fc7aを䜿甚しおおり、次のコマンドを䜿甚しお匿名ボリュヌムを再䜜成できたす。

docker-compose up -d --build --force-recreate --renew-anon-volumes db

フラグ--renew-anon-volumesが最近远加されたようです

Docker version 18.06.1-ce, build e68fc7aを䜿甚しおおり、次のコマンドを䜿甚しお匿名ボリュヌムを再䜜成できたす。

docker-compose up -d --build --force-recreate --renew-anon-volumes db

フラグ--renew-anon-volumesが最近远加されたようです

このオプションを蚱可しおいただきありがずうございたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡