mkdir:无法创建目录“cpuset”:在Dockerfile中运行“服务Docker启动”时的只读文件系统

sshcrbum  于 2023-02-03  发布在  Docker
关注(0)|答案(1)|浏览(440)

我有一个扩展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中的 * 完全相同 * 命令可以工作?
我已经尝试了类似问题的大多数答案,例如herehere,但不幸的是,它们没有帮助。
如果可能的话,我宁愿尽量避免使用chmod 777 /var/run/docker.sock解决方案,这应该是因为我的jenkins映像可以正确地构建...

t2a7ltrp

t2a7ltrp1#

只需删除RUN service start docker行。
docker CLI工具需要连接到一个Docker守护进程,这通常是通过/var/run/docker.sock Unix套接字文件完成的。将套接字绑定安装到容器中足以使主机的Docker守护进程可访问;不需要在容器中单独启动Docker。
RUN service ...这一行有几个问题:Docker的内部设置比较复杂,而且它所做的一些事情在容器中通常是不允许的;这可能与“cannot create directory”错误有关。在任何情况下,Docker映像都不会持久化正在运行的进程,因此,如果您能够在构建内部启动Docker,那么当容器最终运行时,它不会仍然运行。
从概念上讲,容器并不“运行服务”,它只是一个进程(及其子进程)的 Package 器。像servicesystemctl这样的命令通常不会像您期望的那样工作,我通常会避免在Docker上下文中使用它们。

相关问题