4

我创建了一个新的带有 Docker 的 Digital Ocean 服务器(使用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 似乎也很流行。

4

3 回答 3

1

要使用 Laravel Deployer,你应该通过 ssh 直接连接到工作空间容器。

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

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

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

于 2019-12-18T16:43:31.773 回答
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的持久化容器,并启动一个新的容器实例,该实例将在安装依赖项后停止。phpruncomposer

于 2020-09-19T01:54:46.170 回答
0

你应该试试

docker-compose exec -T php-fpm bash;

-T 选项将

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

于 2018-07-19T15:58:12.270 回答