从Docker容器内部使用XDebug进行远程调试不起作用

时间:2015-06-02 11:27:36

标签: php intellij-idea docker xdebug remote-debugging

我尝试设置停靠的AMP环境并且无法使远程调试器正常工作。我的设置如下:

我有一个运行mysql的数据库容器,它像魅力一样工作。我构建了一个Docker镜像' phpmysqli'使用以下Dockerfile

FROM php:apache

RUN docker-php-ext-install mysqli mbstring

# zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
RUN pecl install xdebug
RUN echo 'zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so' >> /usr/local/etc/php/php.ini
RUN touch /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_enable=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_autostart=0 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_connect_back=1 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_port=9000 >> /usr/local/etc/php/conf.d/xdebug.ini; \
    echo xdebug.remote_log=/tmp/php5-xdebug.log >> /usr/local/etc/php/conf.d/xdebug.ini;

RUN echo 'date.timezone = Europe/Berlin' > /usr/local/etc/php/conf.d/date.ini

我打电话

docker run --rm -ti  --name web -p 127.0.0.1:8080:80 -v /path/to/projects:/var/www/html --link db:db  phpmysqli

分别在这个phpinfo之后,php -i显示xdebug 2.3.2正在启动并运行。

接下来,我在IntelliJ IDEA中设置一个名为' Docker'主机127.0.0.1,端口8080和调试器Xdebug。我在docker run语句中设置了与Volume mapping类似的路径映射。

PHP->调试设置中,我检查了我使用端口9000进行传入连接,我将接受外部连接,并且我不会忽略来自未注册服务器的连接。

在此之后,我创建了一个名为Docker的新的PHP远程调试配置。服务器是Docker,会话ID是XDEBUG_IDEA

我可以在Container上调用PHP文件,我可以通过链接连接到数据库...但由于某些原因,当我尝试启动调试会话时,没有任何事情发生。我尝试使用cookie(是的,我将XDEBUG_IDEA设置为xdebug helper中的会话ID)。我尝试将XDEBUG_SESSION_START=XDEBUG_IDEA发送为GET ...

那么聪明的人能告诉我我错过了什么吗?

4 个答案:

答案 0 :(得分:13)

您可以尝试使用此配置。 php-apache build提供了两种编译和启用模块php的方法。 使用docker-php-ext-enable xdebug设置正确的文件配置会更好。

FROM php:5.4-apache

# Enable and configure xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN sed -i '1 a xdebug.remote_autostart=true' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_mode=req' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_handler=dbgp' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_connect_back=1 ' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_port=9000' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_host=127.0.0.1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN sed -i '1 a xdebug.remote_enable=1' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

答案 1 :(得分:0)

关闭:xdebug.remote_connect_back=0 添加:xdebug.remote_host=192.168.0.102[your docker host/machine IP]

答案 2 :(得分:0)

对于我来说,在使用Sublime的PHP,NGINX Docker环境中,我可以使用以下设置:

   import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;

import org.apache.commons.io.IOUtils;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class putty {
    public static String user = "username";
    public static String host = "server1.server.net";
    public static String password = "Password";
    public static String secondpassword = "Password";
    public static String tunnelRemoteHost = "server2.server.net";

    public static void main(String[] args) throws IOException, JSchException, SftpException {
        StringBuilder outputBuffer = new StringBuilder();    
        int port = 22;    
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        int forwardPort = 2222;
        session.setPortForwardingL(forwardPort, tunnelRemoteHost, 22);
        Session secondSession = jsch.getSession(user, "localhost", forwardPort);
        secondSession.setPassword(secondpassword);
        secondSession.setConfig("StrictHostKeyChecking", "no");        
        secondSession.connect();      
        session.openChannel("sftp");
         // now we're connected to the secondary system
        Channel channel = secondSession.openChannel("sftp");
        channel.connect();
        ChannelSftp channelSftp = (ChannelSftp)channel;     

        channel.disconnect();

        session.disconnect();

        System.out.print(outputBuffer.toString());

    }
}

一个让我永远想不通的方法是将remote_host设置为host.docker.internal。

答案 3 :(得分:0)

如果您不想更改容器中的xdebug配置,并希望使用xdebug.remote_connect_back=1使其工作,则可以将HTTP标头X-Forwarded-For设置为host.docker.internal的IP地址因此定义了xdebug首选并用作客户端IP而不是$_SERVER['HTTP_X_FORWARDED_FOR']的PHP $_SERVER['REMOTE_ADDR']