Docker、Django 和 Selenium - Selenium 无法连接 [英] Docker, Django and Selenium - Selenium unable to connect

查看:11
本文介绍了Docker、Django 和 Selenium - Selenium 无法连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将 Docker 配置为使用 docker-compose.yml 运行 Postgres 和 Django,并且运行良好.

I have Docker configured to run Postgres and Django using docker-compose.yml and it is working fine.

我遇到的问题是 Selenium 无法连接到 Django liveserver.

The trouble I am having is with Selenium not being able to connect to the Django liveserver.

现在(至少对我而言)django 必须访问 selenium 来控制浏览器并且 selenium 必须访问 django 来访问服务器是有道理的.

Now it makes sense (to me at least) that django has to access selenium to control the browser and selenium has to access django to access the server.

我已经尝试使用 docker 'ambassador' 模式对 docker-compose.yml 从这里使用以下配置:https://github.com/docker/compose/issues/666

I have tried using the docker 'ambassador' pattern using the following configuration for docker-compose.yml from here: https://github.com/docker/compose/issues/666

postgis:
  dockerfile: ./docker/postgis/Dockerfile
  build: .
  container_name: postgis

django-ambassador:
  container_name: django-ambassador
  image: cpuguy83/docker-grand-ambassador
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
  command: "-name django -name selenium"

django:
  dockerfile: ./docker/Dockerfile-dev
  build: .
  command: python /app/project/manage.py test my-app
  container_name: django
  volumes:
    - .:/app
  ports:
    - "8000:8000"
    - "8081:8081"
  links:
    - postgis
    - "django-ambassador:selenium"
  environment:
    - SELENIUM_HOST=http://selenium:4444/wd/hub

selenium:
  container_name: selenium
  image: selenium/standalone-firefox-debug
  ports:
    - "4444:4444"
    - "5900:5900"
  links:
    - "django-ambassador:django"

当我检查 http://DOCKER-MACHINE-IP:4444/wd/hub/static/resource/hub.html我可以看到 Firefox 启动了,但是所有测试都失败了,因为 Firefox 无法连接到 django

When I check http://DOCKER-MACHINE-IP:4444/wd/hub/static/resource/hub.html I can see that firefox starts, but all the tests fail as firefox is unable to connect to django

'Firefox can't establish a connection to the server at localhost:8081'

我也在这里尝试了这个解决方案 https://github.com/docker/compose/issues/1991但是这不起作用,因为我无法让 django 同时连接到 postgis 和 selenium

I also tried this solution here https://github.com/docker/compose/issues/1991 however this is not working cause I can't get django to connect to postgis and selenium at the same time

'django.db.utils.OperationalError: could not translate host name "postgis" to address: Name or service not known'

我尝试使用下面列出的网络功能

I tried using the networking feature as listed below

postgis:
  dockerfile: ./docker/postgis/Dockerfile
  build: .
  container_name: postgis
  net: appnet

django:
  dockerfile: ./docker/Dockerfile-dev
  build: .
  command: python /app/project/manage.py test foo
  container_name: django
  volumes:
    - .:/app
  ports:
    - "8000:8000"
    - "8081:8081"
  net: appnet
  environment:
    - SELENIUM_HOST=http://selenium:4444/wd/hub

selenium:
  container_name: selenium
  image: selenium/standalone-firefox-debug
  ports:
    - "4444:4444"
    - "5900:5900"
  net: appnet

但结果是一样的

'Firefox can't establish a connection to the server at localhost:8081'

那么如何让 selenium 连接到 django?

So how can I get selenium to connect to django?

我已经玩了好几天了 - 非常感谢您的帮助.

I have been playing around with this for days - would really appreciate any help.

更多信息

另一件奇怪的事情是,当测试服务器运行时使用 docker(使用我的 virtualenv 旧配置等)如果我运行 ./manage.py test foo 我可以通过任何方式访问服务器浏览器在 http://localhost:8081 并获得网页,但我在运行时无法访问测试服务器如果我在 docker 下运行它,则等效命令.这很奇怪,因为我正在映射端口 8081:8081 - 这是否相关?

Another weird thing is that when the testserver is running not using docker (using my old config of virtualenv etc.) if I run ./manage.py test foo I can access the server through any browser at http://localhost:8081 and get served up webpages, but I can't access the test server when I run the equivalent command if I run it under docker. This is weird cause I am mapping port 8081:8081 - is this related?

注意:我使用的是 OSX 和 Docker v1.9.1

Note: I am using OSX and Docker v1.9.1

推荐答案

我最终想出了一个更好的解决方案,它不需要我对 IP 地址进行硬编码.下面是我用来在 django 中使用 docker 运行测试的配置.

I ended up coming up with a better solution that didn't require me to hardcode the IP Address. Below is the configuration I used to run tests in django with docker.

# docker-compose base file for everything
version: '2'

services:
  postgis:
    build:
      context: .
      dockerfile: ./docker/postgis/Dockerfile
    container_name: postgis
    volumes:
      # If you are using boot2docker, postgres data has to live in the VM for now until #581 fixed
      # for more info see here: https://github.com/boot2docker/boot2docker/issues/581
      - /data/dev/docker_cookiecutter/postgres:/var/lib/postgresql/data

  django:
    build:
      context: .
      dockerfile: ./docker/django/Dockerfile
    container_name: django
    volumes:
      - .:/app
    depends_on:
      - selenium
      - postgis
    environment:
      - SITE_DOMAIN=django
      - DJANGO_SETTINGS_MODULE=settings.my_dev_settings
    links:
      - postgis
      - mailcatcher

  selenium:
    container_name: selenium
    image: selenium/standalone-firefox-debug:2.52.0
    ports:
      - "4444:4444"
      - "5900:5900"

Dockerfile(用于 Django)

ENTRYPOINT ["/docker/django/entrypoint.sh"]

在入口点文件中

#!/bin/bash
set -e

# Now we need to get the ip address of this container so we can supply it as an environmental
# variable for django so that selenium knows what url the test server is on
# Use below or alternatively you could have used
# something like "$@ --liveserver=$THIS_DOCKER_CONTAINER_TEST_SERVER"

if [[ "'$*'" == *"manage.py test"* ]]  # only add if 'manage.py test' in the args
then
  # get the container id
  THIS_CONTAINER_ID_LONG=`cat /proc/self/cgroup | grep 'docker' | sed 's/^.*///' | tail -n1`
  # take the first 12 characters - that is the format used in /etc/hosts
  THIS_CONTAINER_ID_SHORT=${THIS_CONTAINER_ID_LONG:0:12}
  # search /etc/hosts for the line with the ip address which will look like this:
  #     172.18.0.4    8886629d38e6
  THIS_DOCKER_CONTAINER_IP_LINE=`cat /etc/hosts | grep $THIS_CONTAINER_ID_SHORT`
  # take the ip address from this
  THIS_DOCKER_CONTAINER_IP=`(echo $THIS_DOCKER_CONTAINER_IP_LINE | grep -o '[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+')`
  # add the port you want on the end
  # Issues here include: django changing port if in use (I think)
  # and parallel tests needing multiple ports etc.
  THIS_DOCKER_CONTAINER_TEST_SERVER="$THIS_DOCKER_CONTAINER_IP:8081"
  echo "this docker container test server = $THIS_DOCKER_CONTAINER_TEST_SERVER"
  export DJANGO_LIVE_TEST_SERVER_ADDRESS=$THIS_DOCKER_CONTAINER_TEST_SERVER
fi


eval "$@"

在你的 Django 设置文件中

SITE_DOMAIN = 'django'

然后运行你的测试

docker-compose run django ./manage.py test

这篇关于Docker、Django 和 Selenium - Selenium 无法连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆