我已经将Docker配置为使用docker-compose.yml运行Postgres和Django,并且工作正常。
我遇到的麻烦是Selenium无法连接到Django liveserver。
现在(至少对我而言),django必须访问selenium才能控制浏览器,而selenium必须访问django才能访问服务器。
我已经尝试从此处使用docker- compose.yml的以下配置使用docker’大使’模式: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,所有测试都失败了
'Firefox can't establish a connection to the server at localhost:8081'
我也在这里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'
我尝试使用下面列出的网络功能
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
但结果是一样的
那么我怎样才能使selenium连接到Django?
我已经玩了好几天了-非常感谢您的帮助。
更多信息
另一个怪异的事情是,如果我运行./manage.py test foo,那么当测试服务器运行时 不 使用docker (使用我的virtualenv等旧配置)时,我可以通过http:// localhost:8081上的任何浏览器访问服务器,并且获取提供的网页,但是如果我在docker下运行等效命令,则无法访问测试服务器。这很奇怪,因为我正在映射端口8081:8081-这与之相关吗?
注意:我正在使用OSX和Docker v1.9.1
我最终提出了一个更好的解决方案,该解决方案不需要我对IP地址进行硬编码。以下是我使用docker在django中运行测试的配置。
# 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"
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 "$@"
SITE_DOMAIN = 'django'
docker-compose run django ./manage.py test