我正在尝试按照http://jpetazzo.github.io/中描述的过程从运行的jenkins docker容器(jenkins:latest)内的OS X主机上,在运行Docker for Mac 17.06.0-ce-mac17的OSX主机上调用docker 2015/09/03 / do-not- use-docker-in-docker-for-ci /。
我将/var/run/docker.sock安装到容器中,我在其中粘贴了一个ubuntudocker二进制文件,并且能够执行-但是当我运行“ dockerps”时,以用户“ jenkins”的身份从容器内部
尝试在unix:///var/run/docker.sock上连接到Docker守护程序套接字时获得的权限被拒绝:获取http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all = 1:拨打unix /var/run/docker.sock:connect:权限被拒绝。
如果我以root用户身份连接到容器(docker exec -u 0),则它可以工作。
我需要jenkins用户能够运行它。我尝试在ubuntu容器中添加一个docker组并向其中添加jenkins,但这无济于事,因为它与外部无关,而且Mac的Docker无法像在Linux上运行此功能那样轻松完成uid / gid匹配。我想分发这个容器,所以回答并破解我的Docker for Mac安装的一部分并不能真正帮助我。如果可以的话,我宁愿不以root用户身份运行整个jenkins安装程序。(我也尝试过以特权方式运行容器,这没有帮助。)
根据在Macbook中运行Jenkins管道时尝试连接到DockerDaemon时权限拒绝中的建议,我将容器内的/var/run/docker.sock文件手动更改为jenkins,现在jenkins可以运行docker。但是我在想出一个可分发容器的解决方案时遇到了麻烦- 我无法在Dockerfile中执行该操作,因为该文件尚不存在,并且进入入口点也无济于事,因为它作为詹金斯运行。
为了构建和运行映像,该映像将以非root用户身份从容器内部运行在Mac上的外部docker容器上,我该怎么办?
我可以正常工作,至少是自动化的,但目前仅在Mac的docker上工作。 Mac的Docker具有独特的文件权限模型。手动将/var/run/docker.sock赋予jenkins用户有效,并且在容器重新启动甚至映像重新生成期间仍然存在,但过去的docker守护程序重新启动则不会。另外,您无法在Dockerfile中执行chown,因为docker.sock还不存在,并且您无法在入口点中执行,因为它作为jenkins运行。
所以我要做的就是将詹金斯添加到``staff’‘组中,因为在我的Mac上,/var/run/docker.sock被符号链接到/Users//Library/Containers/com.docker.docker/Data/s60是uid和gid的工作人员。这使jenkins用户可以在主机上运行docker命令。
Dockerfile:
FROM jenkins:latest USER root RUN \ apt-get update && \ apt-get install -y build-essential && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY docker /usr/bin/docker # To allow us to access /var/run/docker.sock on the Mac RUN gpasswd -a jenkins staff USER jenkins ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]
docker-compose.yml文件:
version: "3" services: jenkins: build: ./cd_jenkins image: cd_jenkins:latest ports: - "8080:8080" - "5000:5000" volumes: - ./jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock
但是,这不能移植到其他系统(并且该docker使Mac组保持“人员”,我想不能保证)。我很乐意提出改进建议,以使该解决方案能够在主机系统上正常工作。在诸如詹金斯(Jenkins)Docker容器内的Execute docker host命令之类的问题中建议的其他选项包括: