我正在使用一个非常简单的.travis.yml来通过Travis-CI中的docker编译cpp程序。 (我的动机是在特拉维斯CI中试验运行码头工人。)
sudo: required
services:
- docker
before_install:
- docker pull glot/clang
script:
- sudo docker run --rm -v "$(pwd)":/app -w /app glot/clang g++ main.cpp
但build is failing有以下错误:
/usr/bin/ld: cannot open output file a.out: Permission denied
。这与我是否使用sudo
无关。有人可以帮助我找出根本原因并帮助解决这个问题吗?感谢。
答案 0 :(得分:1)
我建议您明确设置安装路径,而不是$(pwd)
。然后,您需要检查容器内的权限。尝试类似的东西:
sudo docker run --rm -v "$(pwd)":/app -w /app glot/clang stat /app
这将显示文件夹权限。可能没人能写入这个文件夹。
此外,您应该避免使用root
权限构建软件,这是不安全的。创建非priveleged用户并在运行编译器时使用它们。
<强> UPD:强>
我无法使用docker 1.6.0
重现此问题,可能是由Travis-CI虚拟机持久保存的某些文件系统设置引起的。这就是我在localhost上的内容:
➜ /tmp mkdir /tmp/code
➜ /tmp echo "int main(){}" > /tmp/code/main.cpp
➜ /tmp echo "g++ main.cpp && ls -l" > /tmp/code/build.sh
➜ /tmp docker run --rm -v /tmp/code:/app -w /app glot/clang bash /app/build.sh
total 20
-rwxr-xr-x 1 glot glot 8462 Dec 30 10:19 a.out
-rwxrwxr-x 1 glot glot 22 Dec 30 10:17 build.sh
-rw-rw-r-- 1 glot glot 13 Dec 30 10:10 main.cpp
如您所见,生成的二进制文件显示在/app
文件夹