无法在Travis-CI中通过docker编译cpp:/ usr / bin / ld:无法打开输出文件a.out:Permission denied

我正在使用一个非常简单的.travis.yml在Travis-CI中通过docker编译一个cpp程序。 (我的动机是在Travis CI中运行Docker。)

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失败 ,出现以下错误: /usr/bin/ld: cannot open output file a.out: Permission denied 。 这是不pipe我是否使用sudo 。 有人可以帮我找出根源并帮助解决这个问题吗? 谢谢。

我build议你明确地设置安装path,而不是用$(pwd)来做。 然后,您需要检查容器内的权限。 尝试类似的东西:

 sudo docker run --rm -v "$(pwd)":/app -w /app glot/clang stat /app 

这将显示文件夹的权限。 可能没有人能够写入这个文件夹。

你也应该避免使用root权限来构build你的软件,这是不安全的。 创build非特权用户并在运行编译器时使用它们。

UPD:我无法用docker 1.6.0来重现这个问题,这可能是由Travis-CI虚拟机持续存在的一些文件系统设置造成的。 这是我在我的本地主机上:

 ➜ /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文件夹中