• Как правильно делать deploy с помощью docker registry?

    Tyranron
    @Tyranron
    Официальную документацию надо все же читать, проявив усидчивость. Тогда не будет путаницы в базовых понятиях, из-за которой возникает каша в голове.

    Давайте разберемся с инструментами и их предназначением, которые Вы используете:
    • Комманда docker - это консольный интерфейс (CLI) для работы с Docker
    • docker build создает по заданному Dockerfile образ контейнера
    • docker tag присваивает указанному образу указанный тег (опция -t для build делает то же самое)
    • docker pull скачивает указанный образ из удаленного регистра на текущую машину
    • docker push заливает указанный образ в удаленный регистр
    • docker run запускает новый контейнер из указанного образа
    • docker ps выводит список текущих "бегущих" контейнеров

    Команда docker не жонглирует файлами, она жонглирует образами и контейнерами, а они от нас абстрагированы Docker'ом, как что-то эфемерное. То есть выполняя комманду docker pull Вы не скачиваете образ в ту папку, где выполняете команду, и уж точно не скачиваете какие-либо файлы. Все что Вы делаете этой командой - это скачиваете образ в локальное хранилище Docker'а, дабы Docker daemon мог запустить контейнер на основании этого образа.

    Команда docker-compose - это уже совсем другая команда. Все что она делает - это читает указанный YAML-манифест и выполняет соответствующие команды Docker. Это всего лишь позволяет декларативно указывать желаемые сценарии при работе с Docker в удобном формате. Но ни команда docker, ни docker-compose, не предоставляют ничего для того, чтобы транспортировать/обновлять версии Ваших манифестов где-то там. Docker, опять таки, жонглирует образами и контейнерами, не более.

    У Вас в манифесте указана директива build:. Таким образом docker-compose пытается сначала собрать контейнер, вместо того, чтобы просто запустить его из образа.

    Касательно совета docker-compose.yml под каждый env, все правильно советовали. Именно так это и задумывалось. Вы в манифесте указываете отнюдь не разные окружения (development, production), а набор контейнеров, которые должны бежать в одной связке одной логической единицей (концепция POD'ов). Ничего не запрещает делать и так, как сделали Вы, но это сродни использованию дуршлага в роли миски для еды: сегодня Вы нормально из него наворачиваете пельмени, а завтра супчик в нем уже куда-то не туда утекает.

    Воркфлоу в Вашем случае можно организовать следующим образом:
    1. На dev-машине у Вас один docker-compose.yml, согласно которому контейнер перед запуском собирается из сорцов.
    2. Когда у Вас готова новая версия приложения, Вы его собираете через docker build, присваиваете ему номер версии через docker tag и отправляете в удаленный регистр образов через docker push.
    3. На prod-машине у Вас отдельный docker-compose.ymlв котором указано запускать конкретную версию образа (и никаких build). Новая версия приложения - меняем тег образа в манифесте и перезапускаем контейнеры. При выполнении docker-compose образ автоматически скачается перед запуском, если его нет локально. Если же Вы обновили образ конкретной версии, которая уже была скачана ранее, то да, нужно выполнить docker pull перед стартом, дабы скачать новый образ.


    Дополнительный совет:
    Сборку образа и его заливку в удаленный регистр часто удобно автоматизировать с помощь Makefile'ов.
    Ответ написан
    3 комментария
  • Для чего нужен в Yii2 фильтр ContentNegotiator?

    mitaichik
    @mitaichik
    Вот документация https://github.com/yiisoft/yii2/blob/master/docs/g...

    Основное назначение - вернуть ответ в правильном формате.

    В заголовке Accept клиент указывает в каком формате ему нужны данные, например json или xml
    Из экшена ты можешь возвращать не только строку, но модель, массив (в том числе и моделей), дата-провайдр и т.п.

    ContentNegotiator приводит эти данные к требуемому формату - например, сериализует модель в json, устанавливает заголовки и т.д. Правила сериализации можно описать в модели, или же реализовать свой сериализатор (в документаци это, увы, раскиданно в разных местах). Вообщем, для создания api - необходимая штука.
    Ответ написан
    Комментировать
  • ArrayIterator - что такое и зачем нужен?

    mhthnz
    @mhthnz
    PHP, YII2, Golang, Linux
    Любой объект можно представить в виде массива, элементами в нем будут публичные свойства.
    Мы можем обращаться к объекту как к массиву.
    <?php
    class a {
        public $a = 1;
        public $b = 2;
    }
    $obj = new a();
    foreach ($obj as $value) {
        echo $value.'|';
    }
    //1|2
    ?>

    Итераторы позволяют подсунуть вместо свойств объекта, свой массив и проводить итерации по нему. Тут уже мы итерируем приватное свойство класса, которое представляет из себя массив.
    <?php
    class MyIterator implements Iterator
    {
        private $var = array();
    
        public function __construct($array)
        {
            if (is_array($array)) {
                $this->var = $array;
            }
        }
    
        public function rewind()
        {
            echo "перемотка в начало\n";
            reset($this->var);
        }
      
        public function current()
        {
            $var = current($this->var);
            echo "текущий: $var\n";
            return $var;
        }
      
        public function key() 
        {
            $var = key($this->var);
            echo "ключ: $var\n";
            return $var;
        }
      
        public function next() 
        {
            $var = next($this->var);
            echo "следующий: $var\n";
            return $var;
        }
      
        public function valid()
        {
            $key = key($this->var);
            $var = ($key !== NULL && $key !== FALSE);
            echo "верный: $var\n";
            return $var;
        }
    
    }
    
    $values = array(1,2,3);
    $it = new MyIterator($values);
    
    foreach ($it as $a => $b) {
        print "$a: $b\n";
    }
    ?>

    php.net/manual/ru/language.oop5.iterations.php
    Ответ написан
  • Debug старых версий IOS, что лучше использовать?

    virtual_hack2root
    @virtual_hack2root
    .NET Core, JS, DevOps
    Вам нужно подключтить телефон в режиме разработчика к любому Mac, и включить синхронизацию с Safari на устройстве, затем просто консоль Safari в Mac даст вам доступ к консоли мобильной версии Safari, со всей отладкой и так далее. Hackintosh сейчас ставится на любую машину, более того в сети полно образов VM MacOS с любой версией MacOS они так-же полойдут для отладки.
    Ответ написан
    Комментировать
  • Как установить "Laravel Debugbar" в laravel 5.5?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Vlad Savelev,
    1) chmod -R на `~/storage`
    2) chmod -R на `~/app/bootstrap`

    Это две директории, где может сохраняться кеш
    Ответ написан
    2 комментария