2

Я использую Minikube в качестве локальной тестовой среды и использую многоэтапные сборки Docker для сборки своих контейнеров. Minikube использует версию докера, которая не поддерживает многоэтапную сборку. Minikube предлагает использовать встроенную среду докера для создания контейнеров следующим образом:

#!/usr/bin/env bash
eval $(minikube docker-env)
docker build

Поскольку мне нужно использовать локальный экземпляр Docker для сборки, я нашел сохранение / загрузку Docker. Это означает, что мне нужно сделать следующее:

#!/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 может прочитать файл из стандартного ввода. Если бы я мог направить вывод с моего док-хоста на удаленный док-хост, я мог бы сделать это без изменения / загрязнения окружающей среды моих пользователей. Так что мне было интересно, есть ли какой-нибудь способ загрузить окружение мини-куба в трубе. Я нашел следующие работы, но, конечно, оба докера хосты одинаковы:

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 не использует стандартный ввод. Последнее вызвало синтаксическую ошибку.

Наконец, я мог сделать что-то вроде этого:

#/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 ответ1

1

Нашел простой ответ здесь: https://stackoverflow.com/a/44207110.

docker save $IMG | (eval $(minikube docker-env) && docker load)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .