Django 在docker容器中运行覆盖率测试

Django 在docker容器中运行覆盖率测试,django,docker,dockerfile,travis-ci,coverage.py,Django,Docker,Dockerfile,Travis Ci,Coverage.py,当我测试Django应用程序是否正常工作时,我试图使用覆盖率工具测量其代码覆盖率,但当我推到github时,travis ci中出现了一些错误: Traceback (most recent call last): File "/usr/local/bin/coverage", line 10, in <module> sys.exit(main()) File "/usr/local/lib/python3.6/site-packages/coverage/cmdline.py",

当我测试Django应用程序是否正常工作时,我试图使用覆盖率工具测量其代码覆盖率,但当我推到github时,travis ci中出现了一些错误:

Traceback (most recent call last):
File "/usr/local/bin/coverage", line 10, in <module>
sys.exit(main())
File "/usr/local/lib/python3.6/site-packages/coverage/cmdline.py", line 756, in main
status = CoverageScript().command_line(argv)
File "/usr/local/lib/python3.6/site-packages/coverage/cmdline.py", line 491, in command_line
return self.do_run(options, args)
File "/usr/local/lib/python3.6/site-packages/coverage/cmdline.py", line 641, in do_run
self.coverage.save()
File "/usr/local/lib/python3.6/site-packages/coverage/control.py", line 782, in save
self.data_files.write(self.data, suffix=self.data_suffix)
File "/usr/local/lib/python3.6/site-packages/coverage/data.py", line 680, in write
data.write_file(filename)
File "/usr/local/lib/python3.6/site-packages/coverage/data.py", line 467, in write_file
with open(filename, 'w') as fdata:
PermissionError: [Errno 13] Permission denied: '/backend/.coverage'
The command "docker-compose run backend sh -c "coverage run manage.py test"" exited with 1.
还有我的dockerfile

FROM python:3.6-alpine

ENV PYTHONUNBUFFERED 1

# Install dependencies
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps \
  gcc libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps

# Setup directory structure
RUN mkdir /backend
WORKDIR /backend
COPY scripts/start_dev.sh /
RUN dos2unix /start_dev.sh
COPY . /backend

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D user
RUN chown -R user:user /vol/
RUN chmod -R 755 /vol/web
USER user
docker compose:

backend:
 container_name: backend_dev_blog
 build: ./backend
 command: "sh -c /start_dev.sh"
 volumes:
   - ./backend:/backend
 ports:
   - "8000:8000"
 networks:
   - main
 environment:
   - DB_HOST=db
   - DB_NAME=blog
   - DB_USER=postgres
   - DB_PASS=supersecretpassword
 depends_on:
  - db
backend:
 container_name: backend_dev_blog
 build: ./backend
 command: "sh -c /start_dev.sh"
 user: root
 volumes:
   - ./backend:/backend
 ports:
   - "8000:8000"
 networks:
   - main
 environment:
   - DB_HOST=db
   - DB_NAME=blog
   - DB_USER=postgres
   - DB_PASS=supersecretpassword
 depends_on:
  - db

因此,在看到缺少对/.coverage的权限后,我简单地添加了chmod+x.coverage,但是,这没有什么区别,我还收到了完全相同的错误。

您的权限问题很可能是由于您有一个卷(
/backend:/backend
)并且您正在容器中使用的用户没有在此卷上写入的正确权限(
user

由于您可能无法更改Travis CI目录
/backend
上的权限,因此可以尝试更改用于将文件写入该位置的用户。使用docker compose很容易做到这一点:

backend:
 container_name: backend_dev_blog
 build: ./backend
 command: "sh -c /start_dev.sh"
 volumes:
   - ./backend:/backend
 ports:
   - "8000:8000"
 networks:
   - main
 environment:
   - DB_HOST=db
   - DB_NAME=blog
   - DB_USER=postgres
   - DB_PASS=supersecretpassword
 depends_on:
  - db
backend:
 container_name: backend_dev_blog
 build: ./backend
 command: "sh -c /start_dev.sh"
 user: root
 volumes:
   - ./backend:/backend
 ports:
   - "8000:8000"
 networks:
   - main
 environment:
   - DB_HOST=db
   - DB_NAME=blog
   - DB_USER=postgres
   - DB_PASS=supersecretpassword
 depends_on:
  - db

你能发布你的docker-compose.yml文件吗?@thomaslevel当然可以,所以你需要运行
coverage run--source='.'manage.py test
,告诉coverage插件在计算覆盖率时不要考虑django代码。