Dockerはビルドアップを失敗してコンテナを更新する


変更後のサービスを更新するには以下のコマンドを試してみてください.
docker compose -f docker-compose.prod.yml up --build --no-deps --detach your_service
このコマンドが何をするかを説明しましょう.
  • up サービスを開始するyour_service
  • --build それが存在しないか、変わったならば、イメージを構築してください.変更されていない部分にキャッシュを使用します.
  • --no-deps 関連するサービスを開始しない
  • --detach コンテナをバックグラウンドで実行する
    公式文書docker-compose up )
  • 私たちがイメージの一部であるファイルを変えた後に、私たちが予想するもの
  • 画像の再構築
  • 変更されていない部品の再構築を避けるためにキャッシュを使用する
  • 新画像に基づくコンテナの再起動
  • このコマンドを提案するWeb上には多くの場所があります.問題を掘り下げてみると、その背後にある理由は匿名のボリュームであることがわかった.

    解決策
    匿名ボリュームで問題を修正するには--renew-anon-volumes :
    docker compose -f docker-compose.prod.yml up --build --no-deps --renew-anon-volumes --detach your_service
    
    追加のフラグは、このサービスの再起動時にすべての匿名ボリュームを再作成します.これは、これらのボリュームと表示されるように変更を重複させる.
    他に選択肢がある--force-recreate これは解決策であることを示唆していますが、変更についての匿名ボリュームマッピングの問題を解決しません.

    匿名ボリュームの背後にあるもの

    既存のanonボリュームをチェック
    このコマンドを使用して置換<your container id> コンテナIDを指定します.
    docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' <your container id>
    
    すべての匿名のボリュームは、直接{volume :
    {volume 277654df19e38eeb10f92be90c8df76558033bcd3c7b871e75abdc14174a46d8 /var/lib/docker/volumes/277654df19e38eeb10f92be90c8df76558033bcd3c7b871e75abdc14174a46d8/_data /opt/app/etc local  true }
    

    どのように、私はそのようなボリュームをつくりますか?
    a . dockerが構成されます.気象研
    services:
      your_service:
         build: .
         volumes:
           - /my_data # anonymous volume
    
    dockerfile
    VOLUME  "/var/logs" "/data"
    
    私たちは通常、ボリューム名と匿名ボリュームを使用するだけで我々のdocker-compose.yml オプションのファイルにフォーカスします.
    我々が公式ドキュメンテーションを見るならばVOLUME 我々は、どんな手がかりも見つけません:

    TheVOLUMEinstruction creates a mount point with the specified name and marks it as holding externally mounted volumes from native host or other containers. The…


    詳細を説明するには、問題をシミュレートする例が必要です.
    src
      config
        name.txt
      hello-world.sh
      Dockerfile
    docker-compose.yml
    
    このリポジトリからこれらのファイルをクローン化できます.
    https://github.com/aheissenberger/docker-anon-volumes
    src/hello world当社のサービスアプリ
    #!/bin/sh
    NAME=$(cat /app/config/name.txt)
    while sleep 5; do  echo  "Hello World! Hello $NAME"; done
    
    src/config/name設定ファイル
    Max
    
    src/dockerfile
    FROM  alpine
    COPY  hello-world.sh  /app/hello-world.sh
    COPY  config/name.txt  /app/config/name.txt
    CMD  \["sh","/app/hello-world.sh"\]
    
    Dockerの作成気象研
    services:
      hello:
        build: ./src
    
    サービスを開始できます.docker compose up --detachヒント:Dockerの最新バージョンを持っていない場合は、置換する必要がありますdocker compose with docker-compose 言葉の間のダッシュで!
    Creating network "docker-anon-volumes_default" with the default driver
    Building hello
    [+] Building 2.0s (8/8) FINISHED                                                           
    Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
    WARNING: Image for service hello was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
    Creating docker-anon-volumes_hello_1 ... done
    Attaching to docker-anon-volumes_hello_1
    hello_1  | Hello World! Hello Max
    hello_1  | Hello World! Hello Max
    
    サービスの出力を確認します.
    $ docker compose logs -f
    hello_1  | Hello World! Hello Max
    hello_1  | Hello World! Hello Max
    hello_1  | Hello World! Hello Max
    ...
    
    ファイル内のコンテンツを変更するsrc/config/name.txt からMax to Rudi echo "Rudi">src/config/name.txt
    と新しい設定でサービスを再起動しますdocker compose up --build --no-deps --detach
    サービスの出力を確認します.
    $ docker compose logs -f
    hello_1  | Hello World! Hello Rudi
    hello_1  | Hello World! Hello Rudi
    ...
    
    まさに我々が期待したこと.
    匿名ボリュームのチェック

  • コンテナのIDを取得する
    $ docker ps        
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
    1df0f6ee87d4   1c356deb72b1   "sh /app/hello-world…"   40 seconds ago   Up 37 seconds             docker-anon-volumes_hello_1
    
  • コマンドを実行して、コンテナIDでボリュームを一覧表示します1df0f6ee87d4 からdocker ps
  • $ docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' 1df0f6ee87d4
    
    このコマンドによる出力はないはずです.
    現在、我々は我々を変えますDockerfile オプションでバインドするapp/config ディレクトリをローカルディレクトリに追加することによってVOLUME コマンド.
    src/dockerfile
    FROM  alpine
    COPY  hello-world.sh  /app/hello-world.sh
    COPY  config/name.txt  /app/config/name.txt
    VOLUME /app/config
    CMD  \["sh","/app/hello-world.sh"\]
    
    新しい設定でサービスを再起動しますdocker compose up --build --no-deps --detach
    サービスの出力を確認します.
    $ docker compose logs -f
    hello_1  | Hello World! Hello Rudi
    hello_1  | Hello World! Hello Rudi
    ...
    
    ファイル内のコンテンツを変更するsrc/config/name.txt からRudi to Franz echo "Franz">src/config/name.txt
    新しい設定でサービスを再起動しますdocker compose up --build --no-deps --detach
    サービスの出力を確認します.
    $ docker compose logs -f
    hello_1  | Hello World! Hello Rudi
    hello_1  | Hello World! Hello Rudi
    ...
    

    This is not what we expected!


    匿名のボリュームをチェックします.

  • コンテナのIDを取得する
    $ docker ps        
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
    2419dd47277a   696b927fee44   "sh /app/hello-world…"   About a minute ago   Up About a minute             docker-anon-volumes_hello_1
    
  • コマンドを実行して、コンテナIDでボリュームを一覧表示します2419dd47277a からdocker ps
  • $ docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' 2419dd47277a
    {volume c62baf7300ddc9dc66a7e871d6511e5e3a6274072cc20c3f14bb59bca5319935 /var/lib/docker/volumes/c62baf7300ddc9dc66a7e871d6511e5e3a6274072cc20c3f14bb59bca5319935/_data /app/config local rw true }
    
    何を得るのですか
  • 我々は匿名のボリュームを我々のコンテナに接続しているvolume c62baf7300ddc9dc66a7e871d6511e5e3a6274072cc20c3f14bb59bca5319935
  • コンテナID2419dd47277a 以前とは違う1df0f6ee87d4 . これは新しいコンテナですname.txt
  • 匿名ボリュームの内容を/app/config ディレクトリと古いファイルを持つ新しいコンテナーを重ねる

  • 固定
  • 削除するVOLUME コマンド
  • 追加--renew-anon-volumes あなたにup --build to recreate this anonymous volume
  • これが起こる理由は、サードパーティのイメージを消費し、このイメージのエクスポートされたボリュームをチェックしたことがないことです.このイメージをコントロールしていないので、これを修正する方法はありません.
    オプション2を試してみましょう):
    ファイルの内容を変更するsrc/config/name.txt からFranz to Hans echo "Hans">src/config/name.txt私たちは、イメージが既に名前=フランツでつくられたので、我々がこれをする必要があります、そして、再構築は、コンテナを再現しないか、匿名のボリュームのレクリエーションでないUpコマンドに何がつながるかを検出して、変えません
    docker compose up --build --no-deps --detach --renew-anon-volumes
    
    サービスの出力を確認します.
    $ docker compose logs -f
    hello_1  | Hello World! Hello Hans
    hello_1  | Hello World! Hello Hans
    ...
    
    これが最初から予想されたことです.