Тот же Dockerfile дает разные результаты во время сборки - PullRequest
0 голосов
/ 31 января 2019

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

При создании контейнера для Angular я придумал Dockerfile для использования в качестве компоновщика в многоступенчатой ​​сборке.Я работал как шарм на моем Mac, поэтому я отправил его в github нашей компании, чтобы его использовали мои коллеги.

Проблема возникает, когда коллега вытащил из репо и попытался собрать на своем Mac (разные моделино более-менее сравнимо, у меня 2015, у него 2016, на котором работает Mojave).

Это содержимое файла dockerfile, который содержит ошибку:

# base image
FROM node:9.6.1 as builder

# install chrome for protractor tests
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update 
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:fontforge/fontforge
RUN apt-get install -y google-chrome-stable
RUN apt-get install -y  fontforge ttfautohint gettext 

Я предполагалон собирается нормально, как на моем ноутбуке, но когда он пытается запустить сборку, он получает некоторые ошибки на шаге RUN apt-get update

Контейнер получает 404 при попытке обновить systemd и завершает работу.

Мы также попытались раскрутить новый контейнер из того же образа docker run --rm -it node:9.6.1 /bin/bash и скопировать все инструкции вручную в командной строке, и все заработало нормально.

1.Почему два разных результата на двух очень похожих, но все же разных машинах?

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

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

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

1 Ответ

0 голосов
/ 31 января 2019

apt-get update, в частности, генерирует результаты, которые меняются во времени.К ним относятся URL-адреса пакетов Debian, и стандартная практика управления пакетами Debian заключается в удалении пакета из списков репозитория, как только появится более новая версия.

Если вы ранее запускали файл Docker до RUN apt-get update, изатем позже изменили, какие конкретные пакеты установлены, вы могли оказаться в состоянии, когда Docker кэшировал результаты операции обновления, но они больше не действительны.

Обычный ответ на это - убедиться, чтовыполните apt-get update && apt-get install в одноместном RUN шаге:

RUN apt-get update \
 && apt-get install -y software-properties-common
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN add-apt-repository -y ppa:fontforge/fontforge
RUN apt-get update \
 && apt-get install -y google-chrome-stable fontforge ttfautohint gettext 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...