如何在Docker(Laradock)中使用Deployer

时间:2018-07-10 22:00:31

标签: docker docker-compose laradock php-deployer docker-exec

我创建了一个新的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似乎也很流行。谢谢。

3 个答案:

答案 0 :(得分:0)

您应该尝试

docker-compose exec -T php-fpm bash;

-T选项将

  

禁用伪tty分配。默认情况下,docker-compose exec会分配TTY。

答案 1 :(得分:0)

要使用laravel部署程序,应通过ssh直接连接到工作区容器。

您可以公开容器的ssh端口: https://laradock.io/documentation/#access-workspace-via-ssh

假设您已将容器ssh端口 22 转发到虚拟机端口 2222 。在这种情况下,您需要将部署程序配置为使用端口 2222

还请记住设置正确的安全SSH密钥,而不是默认密钥。

答案 2 :(得分:0)

在我的特殊情况下,我有单独的PHP和Composer容器。这就是为什么我在部署时无法通过SSH连接到容器的原因。

因此,我像这样配置了bin/phpbin/composer参数:

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

请注意,此处我们将exec用于目前已在运行的持久php容器,并使用run启动composer容器的新实例,该实例将停止安装依赖项之后。