Docker 命令无法在 bash 脚本中运行

Docker 命令无法在 bash 脚本中运行

我有一个 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 --versioninside 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命令。

相关内容