运行 Dockerfile 中的一个脚本

Run a script in Dockerfile

我在 Dockerfile 的构建过程中尝试 运行 脚本。 但是好像不行。

我这样试过:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

也是这样:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

并且还通过执行我的 运行ning 容器:

docker exec symfony /bin/bash -c "/bootstrap.sh"

似乎没有任何效果。

你知道怎么做吗?

RUNENTRYPOINT 是执行脚本的两种不同方式。

RUN 表示它创建一个中间容器,运行s 脚本并在新的中间图像中冻结该容器的新状态。之后脚本将不会 运行:您的最终图像应该反映该脚本的结果。

ENTRYPOINT 表示您的映像(尚未执行脚本)将创建一个容器,并且 运行 是该脚本。

在这两种情况下,都需要添加脚本,RUN chmod +x /bootstrap.sh 是个好主意。

它也应该以 shebang 开头(如 #!/bin/sh

考虑到您的脚本(bootstrap.sh:几个 git config --global 命令),最好在您的 DockerfileRUN 该脚本一次,但要确保使用正确的用户(全局 git config 文件是 %HOME%/.gitconfig,默认情况下是 /root 文件)

添加到您的 Dockerfile:

RUN /bootstrap.sh

然后,当运行安装容器时,检查/root/.gitconfig的内容以确认脚本是运行。

尝试使用 ADD 命令和工作目录规范创建脚本 像这样("script" 是脚本的名称,/root/script.sh 是你想要它在容器中的位置,它可以是不同的路径:

ADD script.sh /root/script.sh

在这种情况下 ADD 必须在 CMD 之前,如果您有一个 顺便说一句,从主机

将脚本导入容器中的任何位置是很酷的方法

CMD地方[./script]

它应该会自动执行你的脚本

您还可以将 WORKDIR 指定为 /root,然后您将在启动容器时自动进入根目录

除以上答案外:

如果您created/edited Windows 中的 .sh 脚本文件,请确保它以 Unix 格式 结尾的行保存。默认情况下,Windows 中的许多编辑器会将 Unix 行结尾转换为 Windows 格式,而 Linux 将无法识别文件开头的 shebang (#!/bin/sh)。所以 Linux 会产生错误消息,就像没有 shebang 一样。

提示:

  • 如果使用Notepad++,需要点击"Edit/EOL Conversion/UNIX (LF)"
  • 如果您使用Visual Studio,我建议安装“End Of Line”插件。 然后您可以通过按 Ctrl-R、Ctrl-W 使行尾可见。要设置 Linux 样式结尾,您可以按 Ctrl-R、Ctrl-L。对于 Windows 样式,请按 Ctrl-R、Ctrl-C。

当您从本地文件系统复制到图像时,最好使用 COPY 而不是 ADD。另外,我建议创建一个子文件夹来放置您的内容。如果不出意外,它可以使事情保持整洁。确保使用 chmod.

将脚本标记为可执行

在这里,我正在创建一个 scripts 子文件夹来放置我的脚本,运行 它来自:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN ./script.sh
WORKDIR /scripts
COPY bootstrap.sh .
RUN ./bootstrap.sh