我有一个 Dockerfile,用于为一些 bash 脚本构建运行时环境,目前它看起来像这样:
FROM debian:buster-slim
RUN apt-get update
RUN apt-get upgrade
RUN apt-get install curl -y
# Install MySQL tools
RUN apt-get install default-mysql-client -y
# Install AWS CLI v2
RUN apt-get install awscli -y
# Install Docker
RUN curl -fsSL https://get.docker.com -o get-docker.sh
RUN chmod +x ./get-docker.sh
RUN ./get-docker.sh
RUN rm get-docker.sh
# Copy jobs into container
WORKDIR /
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
该docker-entrypoint.sh
脚本包含以下内容:
#!/bin/bash
docker --version
/jobs/$1/run.sh
最后,我正在运行的作业(run.sh
最终由 运行的脚本docker-entrypoint.sh
)如下所示:
#!/bin/bash
docker --version
第一次执行docker --version
inside of 的docker-entrypoint.sh
行为符合预期并输出 Docker 版本。第二次执行run.sh
无法运行,并显示以下消息:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
由于某种原因,内部脚本似乎无法访问 docker 守护进程,而外部脚本却可以。
有趣的是,如果我实际上./docker-entrypoint.sh [job-name]
在本地运行,而不是在 Docker 容器内运行,我会从两次执行中获得预期的输出。
有谁能够解释为什么会发生这种情况并帮助解决?
答案1
Docker 套接字不会在运行的容器内自动可用;你需要明确地安装它:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
(带有适当的后缀,例如 :z
如果 SELinux 已启用)。
docker --version
无需套接字即可工作,因为它没有需要Docker 套接字;当/var/run/docker.sock
不存在时,它会返回工具的版本,而不联系守护程序。容器中的脚本必须运行其他docker
命令。