Git clone repo при задержках в Dockerfile

#git #docker #dockerfile

#git #docker #dockerfile

Вопрос:

Я пытаюсь клонировать частное репозиторий, размещенный bitbucket, в контейнер docker. Мой Dockerfile выглядит следующим образом

 RUN git clone git@deploy:<blabla>.git /src/<blabla>
WORKDIR /src/<blabla>
RUN cd /src/<blabla>
RUN git pull --all --tags
RUN git checkout v1.1.2
RUN pip install .
  

Проблема, с которой я столкнулся: мне сказали, что тег v1.1.2 не существует. Чтобы подтвердить это, я изменяю Dockerfile с помощью

 RUN git clone git@deploy:<blabla>.git /src/<blabla>
WORKDIR /src/<blabla>
RUN cd /src/<blabla>
RUN git pull --all --tags
RUN git branch
RUN git tag
RUN git checkout v1.1.2
RUN pip install .
  

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

 RUN git clone git@deploy:<blabla>.git /src/<blabla>
WORKDIR /src/<blabla>
RUN cd /src/<blabla>
RUN git pull --all --tags
RUN git pull --all --tags
RUN git checkout v1.1.2
RUN pip install .
  

и теперь все работает отлично.

Комментарии:

1. git clone —mirror <url> клонирует все ветви и теги, чем вы можете воспользоваться в git checkout версии v1.1.2

2. Происходит ли то же самое с docker build --no-cache ?

Ответ №1:

Попробуйте это:

 RUN git clone -b 'v1.1.2' --single-branch --depth 1 git@deploy:<blabla>.git /src/<blabla> 
   amp;amp; cd /src/<blabla> 
   amp;amp; pip install .

WORKDIR /src/<blabla>
  

Git clone может напрямую извлекать тег, а также добавлять --single-branch и --depth избегать клонирования всей истории репозитория в контейнер.

Он немного компактнее и позволяет избежать дополнительных слоев. Вы все еще можете разбить его на несколько строк, которые вы хотите.