【问题标题】:Docker container: /bin/sh: cat: No such file or directoryDocker容器:/bin/sh:cat:没有这样的文件或目录
【发布时间】:2021-05-17 20:06:41
【问题描述】:

我正在使用 mysql/mysql-server 映像在 docker 中创建一个 mysql 服务器。因为我想自动设置我的数据库(添加用户、创建表),所以我创建了一个 SQL 文件来为我做这件事。为了自动运行该脚本,我用这个 dockerfile 扩展了图像:

FROM mysql/mysql-server:latest

RUN mkdir /scripts
WORKDIR /scripts

COPY ./db_setup.sql .
RUN mysql -u root -p password < cat db_setup.sql

但由于某种原因,会发生这种情况:

/bin/sh: cat: No such file or directory
ERROR: Service 'db' failed to build : The command '/bin/sh -c mysql -u root -p password < cat db_setup.sql' returned a non-zero code: 1

我该如何解决这个问题?

【问题讨论】:

  • &lt; 重定向操作将文件名作为参数,而不是命令。即使不使用 docker,您也无法进行上述重定向。所以认为这是一个码头问题是一个红鲱鱼。
  • 在任何情况下都不能RUN mysql,因为数据库服务器不会在docker build 阶段运行。您是否正在寻找类似/docker-entrypoint-initdb.d 安装脚本目录的内容?
  • @DavidMaze 我知道...我使用 CMD 修复了它,但我知道这不是最好的解决方案。你能提供你的解决方案吗?
  • How can I initialize a MySQL database with schema in a Docker container? 的答案(但不是公认的答案)很好地描述了设置。当数据库容器第一次启动时,该目录中的任何内容都将通过mysql 执行,如果它是*.sql 文件。
  • 我更新了我的答案,在这些 cmets 中加入了很好的信息,这些信息解决了如何为 mysql 映像运行初始化脚本,而不仅仅是提到原始 cat: No such file or directory 错误的来源。

标签: mysql docker


【解决方案1】:

您可以从RUN 命令中删除cat 命令:

RUN mysql -u root -p password < db_setup.sql

返回No such file or directory,因为在WORKDIR设置的当前目录中找不到cat。您可以将 mysql 的标准输入重定向到来自 db_setup.sql 文件。 已编辑以澄清 &lt; sh 重定向期望文件名用于输入。

编辑 2:请记住,您的示例是一个 RUN 命令,它试图运行 mysql 并在 docker 映像构建时间创建一个层。您可能希望在 runtime 的 mysql 入口点脚本期间运行此程序(例如,scripts are run 来自docker-entrypoint-initdb.d/ 目录,由官方 mysql 映像的 docker-entrypoint.sh 脚本)或使用其他功能是documented for the official image

【讨论】:

  • 图像中不一定缺少 cat 命令,但它不是当前工作目录中的 SQL 文件。所以不能作为&lt;重定向的输入。
  • 啊,是的,正确,&lt; 只是期望文件的文件名用于标准输入。 cat 是不必要的,我会澄清我的答案。
【解决方案2】:

RUN 是一个构建时间命令。 MySQL 此时未运行。

如果您在哪里/正在使用standard image,则有一个用于数据库初始化的位置:

FROM mysql:8.0
COPY db_setup.sql /docker-entrypoint-initdb.d

【讨论】:

    【解决方案3】:

    命令 cat 不在 mysql/mysql-server:latest 映像中。

    此外,您只需要在重定向之后提供文件名。

    运行 mysql -u root -p 密码

    【讨论】:

    • 第一个语句不成立。即使图像中确实存在该命令,OP 也会收到相同的错误,除非它们当前的工作目录是 /use/bin
    • 即使当前工作目录不是/use/bin,但是cat的位置也要加到path中
    • &lt; cat 不搜索 PATH,它仅在当前目录中查找名为 cat 的文件;所以它是否在路径中是无关紧要的:无论/usr/bin/cat 是否存在(无论/usr/bin 是否在路径中),用户都会得到&lt; cat 的“找不到文件”,只要/usr/bin 不是他们当前的工作目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2023-04-04
    • 2016-03-28
    • 2015-11-29
    相关资源
    最近更新 更多