Docker, Django and Selenium - Selenium unable to connect

前端 未结 3 2102
太阳男子
太阳男子 2020-12-18 12:28

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

The trouble I am having is with Selenium not being able to conne

3条回答
  •  误落风尘
    2020-12-18 12:49

    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 file

    # 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 (for Django)

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

    In Entrypoint file

    #!/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 "$@"
    

    In your django settings file

    SITE_DOMAIN = 'django'
    

    Then to run your tests

    docker-compose run django ./manage.py test
    

提交回复
热议问题