Docker,Django和Selenium – Selenium无法连接

我有Dockerconfiguration使用docker-compose.yml运行Postgres和Django,它工作正常。

我遇到的麻烦是Selenium无法连接到Django liveserver。

现在对我来说(至less对我来说)django必须访问selenium来控制浏览器,而selenium必须访问django来访问服务器。

我已经尝试使用docker-compose.yml的docker-compose.yml从这里使用docker'ambassador'模式: 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启动了,但所有的testing都失败了,因为firefox无法连接到django

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

我也试过这个解决scheme在这里https://github.com/docker/compose/issues/1991然而,这是行不通的,因为我不能让django连接到postgis和selenium在同一时间

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

我尝试使用下面列出的networkingfunction

 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?

我一直在玩这个天 – 真的很感激任何帮助。

更多信息

另一个奇怪的是,当testserver运行使用docker(使用我的旧configuration的virtualenv等),如果我运行./manage.pytesting富我可以通过任何浏览器访问服务器在http:// localhost:8081和得到了网页,但我不能访问testing服务器,当我运行等效命令,如果我在docker下运行它。 这是奇怪的,因为我正在映射端口8081:8081 – 这是相关的吗?

注意:我正在使用OSX和Docker v1.9.1

我最终提出了一个更好的解决scheme,不需要我对IP地址进行硬编码。 以下是我用Docker在django中运行testing的configuration。

Docker-compose文件

 # 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' 

然后运行你的testing

 docker-compose run django ./manage.py test 

每当看到本地主机时,首先尝试端口转发该端口(在VM级)

请参阅“ 从外部连接到在docker集装箱内运行的服务 ”

 VBoxManage controlvm "default" natpf1 "tcp-port8081,tcp,,8081,,8081" VBoxManage controlvm "default" natpf1 "udp-port8081,udp,,8081,,8081" 

(将defaultreplace为docker-machine的名称:参见docker-machine ls

这在docker主机级别(这是您的基于boot2docker的Linux主机)上的端口映射不同,

OP luke-aus 在评论中证实:

inputnetworking的IP地址解决了问题!

我也一直在努力,终于find了一个解决scheme。 你可以尝试这样的事情:

 postgis: dockerfile: ./docker/postgis/Dockerfile build: . django: dockerfile: ./docker/Dockerfile-dev build: . command: python /app/project/manage.py test my-app volumes: - .:/app ports: - "8000:8000" links: - postgis - selenium # django can access selenium:4444, selenium can access django:8081-8100 environment: - SELENIUM_HOST=http://selenium:4444/wd/hub - DJANGO_LIVE_TEST_SERVER_ADDRESS=django:8081-8100 # this gives selenium the correct address selenium: image: selenium/standalone-firefox-debug ports: - "5900:5900" 

我不认为你需要在seleniumconfiguration中包含端口4444。 该端口默认是公开的,并且不需要将其映射到主机,因为django容器可以通过它与selenium容器的链接直接访问它。

[编辑]我发现你不需要显式暴露django容器的8081端口。 另外,我还为testing服务器使用了一系列端口,因为如果testing是并行运行的,您可以得到一个“Address already in use”的错误,正如这里所讨论的。