0

我想使用 bitbucket 管道为 Django Web 实现一些 CI/CD。目标是:测试 Docker 构建是否正确,然后运行 ​​Django 测试。

但我得到这个错误:

django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'127.0.0.1\' (111 "Connection refused")')

这是bitbucket-pipelines.yml

options:
  docker: true

definitions:
  services:
    mysql:
      image: mysql:5.7
      variables:
          MYSQL_DATABASE: 'foo'
          MYSQL_USER: 'default'
          MYSQL_PASSWORD: 'default'
          MYSQL_RANDOM_ROOT_PASSWORD: 'yes'

  steps:
    - step: &test-docker
        name: "docker builds"
        services:
          - docker
          - mysql
        caches:
          - docker
        script:
          - export IMAGE_NAME=foo:$BITBUCKET_COMMIT
          - export CONTAINER_NAME=test-foo

          - docker build -t $IMAGE_NAME .
          - docker run -p 8080:8080 --name $CONTAINER_NAME --rm -d $IMAGE_NAME

          - docker exec $CONTAINER_NAME python /app/manage.py test tests --noinput
          - docker stop $CONTAINER_NAME

pipelines:
  default:
      - step: *test-docker

我已经尝试了一些解决方案和解决方法,例如。连接来自服务和码头的端口;使用卷;并在 docker 外测试 Django。这个有更多问题,因为它需要 2 个 DB(原始和测试)和一个具有完全访问权限的用户,并且使用入口点不起作用。

4

1 回答 1

0

在您的 django 应用程序中指定的数据库地址,即,127.0.0.1仅当您在本地系统而不是容器中运行 mysql 时才有效。

当您使用 mysql 的 docker 映像时,它有自己的 IP 地址,而不是 127.0.0.1。您可以使用它docker inspect <container id>来获取 IP 地址。

在你的 django settings.py 文件中检查这个:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'foo',
        'USER': 'default',
        'PASSWORD': 'default',
        'HOST': <mysql_ip>, #this is 127.0.0.1 in your case 
        'PORT': '3306',
    }
}

如果您在内部使用 docker 服务docker-compose,您可以简单地使用service nameyml 文件中的 mysql 容器来访问它。

于 2020-05-19T15:16:08.150 回答