我试图在运行jenkins docker容器(jenkins:latest)内部运行Docker for Mac 17.06.0-ce-mac17的OSX主机上调用docker,按照{{3 }}。
我将/var/run/docker.sock挂载到容器中,我在其中粘贴了一个ubuntu docker二进制文件,并且它能够执行 - 但是从容器内部作为用户" jenkins&#34 ;当我跑步,例如" docker ps"我得到了
尝试在unix上连接到Docker守护程序套接字时获得权限被拒绝:///var/run/docker.sock:获取http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/:拨打unix /var/run/docker.sock:connect:permission否认。
如果我以root身份连接到容器(docker exec -u 0),它可以工作。
我需要jenkins用户才能运行它。我尝试添加一个docker组并在ubuntu容器中添加jenkins,但这没有帮助,因为它与外部无关,而Docker for Mac并不像运行这个在Linux上你可以做半容易的uid / gid匹配。我想分发这个容器,所以我的Docker for Mac安装的部分内容和黑客攻击对我来说真的很有帮助。如果我能帮助它,我宁愿不以root身份运行整个jenkins设置。 (我也尝试过将容器作为特权运行,但没有帮助。)
根据http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all=1中的建议,我手动将容器内的/var/run/docker.sock文件与jenkins联系起来,现在jenkins可以运行docker。但是我在为可分发的容器提出解决方案时遇到了麻烦 - 我无法在Dockerfile中执行此操作,因为该文件尚未存在,并且填入入口点并不会出现问题。 ; t help,因为它以jenkins的形式运行。
我需要做些什么来构建和运行一个图像,该图像将作为非root用户在我的Mac上运行外部docker容器?
答案 0 :(得分:1)
对我有用的另一种方法-将uid参数设置为拥有/var/run/docker.sock的uid(在我的情况下为501)。不确定Dockerfile的语法,但不确定docker-compose.yml,就像这样:
version: 3
services:
jenkins:
build:
context: ./JENKINS
dockerfile: Dockerfile
args:
uid: 501
volumes:
- /var/run/docker.sock:/var/run/docker.sock
...
请注意,这是基于使用Dockerfile构建jenkins映像的,因此遗漏了许多细节。关键是uid: 501
下的args
。
答案 1 :(得分:0)
我得到了这个,至少是自动化的,但目前只在Mac上使用docker。 Docker for Mac has a unique file permission model。 chowning /var/run/docker.sock给jenkins用户手动工作,它会在容器重启甚至映像重新生成时保持不变,但不会重启docker守护进程。另外,你不能在Dockerfile中执行chown,因为docker.sock还不存在,你不能在入口点执行,因为它以jenkins的形式运行。
所以我所做的就是将詹金斯添加到"员工" group,因为在我的Mac上,/ var / run / docer.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
然而,这对于其他系统来说是不可移植的(并且依赖于停靠mac group的工作人员和#34;工作人员,"我认为这不是保证)。我喜欢建议的改进,以使此解决方案适用于主机系统。 Execute docker host command inside jenkins docker container等问题中建议的其他选项包括:
答案 2 :(得分:0)
基本上,您需要做的就是更改容器内的/var/run/docker.sock
权限,然后使用sudo
运行docker。
我创建了一个可用于帮助的Dockerfile:
FROM jenkinsci/blueocean:latest
USER root
# change docker sock permissions after moutn
RUN if [ -e /var/run/docker.sock ]; then chown jenkins:jenkins /var/run/docker.sock; fi