运行dockerfile报错/bin/sh: docker: command not found

运行dockerfile报错/bin/sh: docker: command not found

img

dockerfile内容如下


FROM centos:7
COPY web.tar /web.tar
COPY mysql.tar /mysql.tar
RUN docker import /web.tar web && \
    docker import /mysql.tar mysql

docker已经安装并且能够正常使用
解释器可以找到 Docker 的可执行文件
在root账户下运行的

问题出现在Dockerfile中的RUN指令中,该指令尝试在当前容器中执行docker import命令。然而,Docker容器内部并没有安装Docker,所以无法执行该命令。

如果你希望在Docker容器内部执行Docker命令,需要使用Docker-in-Docker(简称DinD)的方式。DinD 允许在容器内部运行另一个 Docker 守护进程,从而在容器中使用 Docker。

以下是一个基于CentOS的示例Dockerfile,使用DinD设置来在容器内部使用Docker:

FROM centos:7

# 安装必要的软件
RUN yum install -y curl unzip

# 在容器内安装Docker
RUN curl -fsSL https://get.docker.com | sh

# 安装Docker Compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose

# 在容器中运行Docker
CMD dockerd

# 复制所需的文件到容器中
COPY web.tar /web.tar
COPY mysql.tar /mysql.tar

# 在容器内部执行Docker命令
RUN docker load -i /web.tar && docker load -i /mysql.tar

请注意,使用DinD可能会引入一些安全风险和性能开销,请在使用之前详细评估其适用性和影响。

如果你不需要在容器内部执行Docker命令,而只是希望将文件复制到容器中,你可以使用COPY指令直接复制到指定的路径,而无需使用Docker命令。

希望这能帮助到你解决问题!请在有需要时随时提问。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Docker 问题集锦(4) - linux 系统中解决 docker: command not found中的 问题 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题有两个可能的解决方案:

    1. 确保docker命令在root用户下可执行。
    2. 使用Docker守护程序的API来导入镜像。

    下面是这两种解决方案的具体步骤和代码示例:

    解决方案一:

    1. 首先,确保在root用户下可以执行docker命令。你可以运行以下命令来验证:
    sudo docker version
    

    如果命令显示docker的版本信息,则说明docker可以在root用户下执行。如果不行,请按照以下步骤解决:

    1. 将当前用户添加到docker组中以获得对docker命令的访问权限。运行以下命令:
    sudo usermod -aG docker $USER
    
    1. 退出当前会话并重新登录,以使用户组的更改生效。

    2. 现在,您可以再次尝试运行dockerfile,应该不会再出现"/bin/sh: docker: command not found"错误。

    解决方案二:

    1. 首先,导入前您需要将web.tar和mysql.tar文件放在一个web目录中。

    2. 使用Docker守护进程的API来导入镜像,可以通过以下Python代码示例实现:

    import docker
    
    client = docker.from_env()
    
    web_image = client.images.import_image("web.tar")
    mysql_image = client.images.import_image("mysql.tar")
    
    web_image.tag("web", "latest")
    mysql_image.tag("mysql", "latest")
    

    上述代码使用了Docker SDK for Python(docker-py),所以你需要安装该库。你可以运行以下命令安装:

    pip install docker
    
    1. 运行上述Python代码将web.tar和mysql.tar导入为Docker镜像。

    请注意,解决方案二依赖于Python和docker-py库。确保您已经在系统上正确安装了这些依赖项。

    无论您选择哪种解决方案,请确保在执行dockerfile之前检查web.tar和mysql.tar的路径和文件是否正确。

    希望能帮到您。如果您有任何进一步的问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

COPY web.tar /web.tar 若存在问题,请确认一下路径问题

如下命令是打算在docker中执行docker命令?虽然也支持如此的循环调用,但是会存在很多问题,这里的宇泛的核心是什么意思?

RUN docker import /web.tar web && \
    docker import /mysql.tar mysql

建议调整语法结构,避免docker镜像里面再调用docker命令