我尝试设置停靠的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
...
那么聪明的人能告诉我我错过了什么吗?
答案 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']
。