TravisCI Docker权限

时间:2016-11-05 18:00:18

标签: php docker file-permissions travis-ci

我使用Docker来运行我的PHP应用程序。现在我希望Travis CI测试我的应用程序。但是我的所有构建都失败了,因为容器无法打开我的应用程序的/ temp目录中的文件。

我有数据容器:

FROM ubuntu

COPY ./ /project
VOLUME /project

CMD ["true"]

我使用自己的基于php的PHP fpm容器:7.0-fpm - 只安装了一些扩展。对于nginx也一样。

我的码头组合看起来像这样

version: '2'
services:
  data:
    build: ./
    volumes:
      - .:/project
    command: "true"
  nginx:
    image: myNginx
    ports:
      - "80:80"
      - "443:443"
    volumes_from:
      - data
    links:
      - php
  php:
    image: myPhp
    ports:
      - "9000:9000"
    volumes_from:
      - data

您可以看到我在主机上使用共享卷。一切都在我的本地机器(窗口)上工作,但不在travis上。

最后我的travis.yml

sudo: required

language: php

services:
  - docker

before_script:
  - docker-compose up --build -d
  # Run firefox
  - docker run -d -p 4444:4444 -p 5900:5900 --name firefox --link my_nginx:nginx --net myapp_default selenium/standalone-firefox-debug:2.53.0

script:
  # Run Codeception
  - docker run --rm --volumes-from my_data --link firefox --net myapp_default --name codeception codeception/codeception run accept

所有代码测试都失败,因为app无法写入/ log而无法打开/ temp中的文件。这很有趣,因为它写了一些文件,但后来无法打开它。

我ls -la结果:

# ./temp
drwxrwxr-x  3 travis travis 4096 Nov  4 15:55 .
drwxrwxr-x 14 travis travis 4096 Nov  4 15:56 ..
drwxr-xr-x  4 root   root   4096 Nov  4 15:55 cache
-rw-rw-r--  1 travis travis   14 Nov  4 15:49 .gitignore

# ./temp/cache
drwxr-xr-x 4 root   root   4096 Nov  4 15:55 .
drwxrwxr-x 3 travis travis 4096 Nov  4 15:55 ..
drwxr-xr-x 2 root   root   4096 Nov  4 15:55 Nette.Configurator
drwxr-xr-x 2 root   root   4096 Nov  4 15:55 _Nette.RobotLoader

# ./temp/cache/Nette.Configurator
drwxr-xr-x 2 root root   4096 Nov  4 15:55 .
drwxr-xr-x 4 root root   4096 Nov  4 15:55 ..
-rw-r--r-- 1 root root 116093 Nov  4 15:55 Container_70d15d6361.php
-rw-r--r-- 1 root root      0 Nov  4 15:55 Container_70d15d6361.php.lock
-rw-r--r-- 1 root root  52913 Nov  4 15:55 Container_70d15d6361.php.meta

我很确定我在travis或容器中设置了错误的权限,但我不知道如何修复它。

1 个答案:

答案 0 :(得分:2)

Travis提取的文件将归travis用户和组所有,而容器内运行的进程则希望活动用户成为所有者。我有一个docker-compose文件在我的Mac上正常运行,但在Travis上失败了。

对我来说,通过将其添加到install中的.travis.yaml步骤来修复此问题(编辑:您可能希望将其放在before_script部分中):

install
    - docker-compose run --user='root' --entrypoint chown worker_test -R myuser:myuser .

对UID / GID位的这种写法很有帮助:Understanding user file ownership in docker: how to avoid changing permissions of linked volumes