如何影響管道中的副作用

如何影響管道中的副作用

我正在運行 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 可以從 stdin 讀取檔案。如果我可以將 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

但由於它有很多交互接口,一旦其中一個接口發生變化,它很可能就會開始失敗。

編輯:我發現了上述的改進,我認為它可能不那麼脆弱,但仍然比理想的要好:

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)

相關內容