Как использовать Deployer с Docker (Laradock)

Я создал новый сервер Digital Ocean с Docker на нем (используя Laradock), и мой веб-сайт Laravel заработал нормально.

Теперь я хочу автоматизировать развертывание с помощью Deployer.

Я думаю, что моя единственная проблема заключается в том, что я не могу заставить Deployer запустить docker exec -it $(docker-compose ps -q php-fpm) bash;, что является командой, которую я успешно использую вручную для входа в соответствующий контейнер Docker (после использования SSH для подключения с моей локальной машины к серверу Digital Ocean).

Когда Deployer пытается запустить его, я получаю следующее сообщение об ошибке:

➤ Executing task execphpfpm
[1.5.6.6] > cd /root/laradock && (pwd;)
[1.5.6.6] < /root/laradock
[1.5.6.6] > cd /root/laradock && (docker exec -it $(docker-compose ps -q php-fpm) bash;)
[1.5.6.6] < the input device is not a TTY
➤ Executing task deploy:failed
• done on [1.5.6.6]
✔ Ok [3ms]
➤ Executing task deploy:unlock
[1.5.6.6] > rm -f ~/daily/.dep/deploy.lock
• done on [1.5.6.6]
✔ Ok [188ms]

In Client.php line 99:

  [Deployer\Exception\RuntimeException (1)]
  The command "cd /root/laradock && (docker exec -it $(docker-compose ps -q php-fpm) bash;)" failed.

  Exit Code: 1 (General error)

  Host Name: 1.5.6.6

  ================
  the input device is not a TTY

Вот соответствующие части моего deploy.php:

host('1.5.6.6')
        ->user('root')
        ->identityFile('~/.ssh/id_rsa2018-07-09')
        ->forwardAgent(true)
        ->stage('production')
        ->set('deploy_path', '~/{{application}}');

before('deploy:prepare', 'execphpfpm');

task('execphpfpm', function () {
    cd('/root/laradock');
    run('pwd;');
    run('docker exec -it $(docker-compose ps -q php-fpm) bash;');
    run('pwd');
});

Я уже провел полтора дня, читая бесчисленное количество статей и пробуя так много разных вариантов. Например. замена флага -it на -i, или установка export COMPOSE_INTERACTIVE_NO_CLI=1, или замена всей команды docker exec на docker-compose exec php-fpm bash;.

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


person Ryan    schedule 10.07.2018    source источник
comment
До сих пор я выяснил, что вместо этого использование run('cd /root/laradock && (docker exec -it $(docker-compose ps -q php-fpm) bash;)', ['tty' => true]); приводит к тому, что мой сценарий deploy.php успешно переключается в контейнер php-fpm, но приостанавливает Deployer до тех пор, пока я не наберу exit, после чего он, к сожалению, переключается обратно из контейнера php-fpm (и поэтому терпит неудачу). Если я вместо этого использую run('cd /root/laradock && (docker exec -i $(docker-compose ps -q php-fpm) bash;)');, эта команда будет полностью проигнорирована; каталог остается как /root на верхнем уровне сервера, а не в контейнере.   -  person Ryan    schedule 11.07.2018
comment
См. также stackoverflow. com/questions/32878795/, где они используют docker exec container-name bash -l -c . Вы можете использовать его для запуска команд внутри контейнера рабочей области.   -  person rhand    schedule 05.01.2019


Ответы (3)


Чтобы использовать Laravel Deployer, вы должны подключиться через ssh напрямую к контейнеру рабочей области.

Вы можете указать ssh-порт контейнера: https://laradock.io/documentation/#access-workspace-via-ssh

Допустим, вы перенаправили порт 22 контейнера ssh на порт 2222 виртуальной машины. В этом случае вам нужно настроить свой Deployer для использования порта 2222.

Также не забудьте установить правильные безопасные ключи SSH, а не ключи по умолчанию.

person Yudi Kubota    schedule 18.12.2019

Тебе стоит попробовать

docker-compose exec -T php-fpm bash;

Опция -T будет

Отключите выделение псевдотерминала. По умолчанию docker-compose exec назначает TTY.

person DinoAmino    schedule 19.07.2018
comment
Спасибо, но я это уже пробовал. Смотрите мой вопрос. -it уже включает опцию T. - person Ryan; 19.07.2018

В моем конкретном случае у меня были отдельные контейнеры для PHP и Composer. Вот почему я не мог подключиться к контейнеру по SSH во время развертывания.

Поэтому я настроил параметры bin/php и bin/composer следующим образом:

set('bin/php', 'docker exec php php');
set('bin/composer', 'docker run --volume={{release_path}}:/app composer');

Обратите внимание, что здесь мы используем exec для постоянного контейнера php, который уже запущен в данный момент, и run для запуска нового экземпляра контейнера composer, который остановится после установки зависимостей.

person Kolyunya    schedule 19.09.2020