
私は、ローカル テスト環境として minikube を実行し、docker マルチステージ ビルドを使用してコンテナーを構築しています。Minikube は、マルチステージ ビルドをサポートしていないバージョンの docker を実行します。Minikube は、次のように組み込みの docker 環境を使用してコンテナーを構築することを提案しています。
#!/usr/bin/env bash
eval $(minikube docker-env)
docker build
ビルドにはローカルの docker インスタンスを使用する必要があるため、docker save/load を見つけました。つまり、次の操作を行う必要があります。
#!/usr/bin/env bash
docker build
docker save $IMG > /tmp/container.tar
eval $(minikube docker-env) # set up docker env vars
docker load -i /tmp/container.tar
eval $(minikube docker-env -u) # clean up env
ただし、docker load は標準入力からファイルを読み取ることができます。docker ホストからの出力をリモート docker ホストにパイプできれば、ユーザーの環境を変更したり汚染したりすることなくこれを行うことができます。そこで、パイプ環境内で minikube env をロードする方法があるかどうか疑問に思いました。次の方法が機能することを発見しましたが、もちろん両方の docker ホストは同じです。
docker save $IMG | env -i docker load
しかし、私は次のようなもの(疑似コードだと思います)が欲しいです
docker save $IMG | env -i side_effects(eval $(minikube docker-env)) docker load
単純にコマンドを挿入してみました (実際にこれが機能するとは思っていませんでした):
docker save $IMG | env -i eval $(minikube docker-env) docker load
値をロードする関数を作成します。
function load_env { eval $(minikube docker-env) }
docker save $IMG | env -i load_env() docker load
どちらも機能しませんでした。確信はありませんが、eval はパイプされたデータを受け取っていたと推測します。また、eval は stdin を使用しません。後者は構文エラーを引き起こしました。
最終的に、次のようなことができます。
#/usr/bin/env bash
hostenv=$(minikube docker-env | grep DOCKER_HOST | cut -f2 -d'='
certpath=$(minikube docker-env | grep DOCKER_CERT_PATH | cut -f2 -d'='
docker save $IMG | docker -H=$hostenv --tls=true --tlsverify=true \
--tlscacert=$certpath/ca.pem --tlscert=$certpath/cert.pem \
--tlskey=$certpath/key.pem
しかし、これには相互作用するインターフェースが多数あるため、そのうちの 1 つが変更されるとすぐに障害が発生する可能性が高くなります。
編集: 上記の改善点を見つけました。おそらく壊れにくくなったと思いますが、それでも理想よりは劣っています。
dockerenv=$(minikube docker-env | sed 's/export//g' | sed 's/^#.*$//g' | sed 's/"//g')
docker save $IMG | env -i $dockerenv docker load
それで本当に私が尋ねているのは、ユーザーのマシン上の一時ファイルや環境汚染を回避する堅牢な方法があるかどうかです。(この質問にもっと良いタイトルがあれば教えてください。お願いしますそれを変更してください。これは私の問題を解決する唯一の方法です。
答え1
ここで簡単な答えを見つけました:https://stackoverflow.com/a/44207110。
docker save $IMG | (eval $(minikube docker-env) && docker load)