我有一个扩展Apache Airflow2.5.1
基本映像的Dockerfile。我想做的是能够在我的airflow
容器(即docker-in-docker)中使用docker
进行测试和评估。
我的docker-compose.yaml
具有以下挂载:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
我的Dockerfile如下所示:
FROM apache/airflow:2.5.1
USER root
RUN apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release nano
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
RUN echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get update
RUN apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
RUN groupadd -f docker
RUN usermod -a -G docker airflow
RUN service docker start
USER airflow
基本上:
- 安装
docker
。 - 将
airflow
用户添加到docker
组。 - 启动
docker
服务。 - 按
airflow
继续。
不幸的是,这不起作用。在RUN service docker start
期间,我遇到以下错误:
Step 11/12 : RUN service docker start
---> Running in 77e9b044bcea
mkdir: cannot create directory ‘cpuset’: Read-only file system
我有另一个Dockerfile用于构建本地jenkins
映像,如下所示:
FROM jenkins/jenkins:lts-jdk11
USER root
RUN apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release nano
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
RUN echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get update
RUN apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
RUN groupadd -f docker
RUN usermod -a -G docker jenkins
RUN service docker start
USER jenkins
也就是说,它是完全相同的,除了我使用的是jenkins用户。
我没有在/var/run/docker.sock
上设置任何额外的权限:
$ ls -la /var/run/docker.sock
srw-rw---- 1 root docker 0 Jan 18 17:14 /var/run/docker.sock
我的问题是:
1.为什么在构建airflow
映像时RUN service start docker
不工作?
1.为什么jenkins
Dockerfile中的 * 完全相同 * 命令可以工作?
我已经尝试了类似问题的大多数答案,例如here和here,但不幸的是,它们没有帮助。
如果可能的话,我宁愿尽量避免使用chmod 777 /var/run/docker.sock
解决方案,这应该是因为我的jenkins
映像可以正确地构建...
1条答案
按热度按时间t2a7ltrp1#
只需删除
RUN service start docker
行。docker
CLI工具需要连接到一个Docker守护进程,这通常是通过/var/run/docker.sock
Unix套接字文件完成的。将套接字绑定安装到容器中足以使主机的Docker守护进程可访问;不需要在容器中单独启动Docker。RUN service ...
这一行有几个问题:Docker的内部设置比较复杂,而且它所做的一些事情在容器中通常是不允许的;这可能与“cannot create directory”错误有关。在任何情况下,Docker映像都不会持久化正在运行的进程,因此,如果您能够在构建内部启动Docker,那么当容器最终运行时,它不会仍然运行。从概念上讲,容器并不“运行服务”,它只是一个进程(及其子进程)的 Package 器。像
service
或systemctl
这样的命令通常不会像您期望的那样工作,我通常会避免在Docker上下文中使用它们。