在 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"

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

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

好像都没用。

你知道怎么做吗?

449588 次浏览

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

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

ENTRYPOINT意味着您的映像(尚未执行脚本)将创建一个容器,并运行该脚本。

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

它也应该以 开始吧开始(如 #!/bin/sh)

考虑到你的脚本(bootstrap.sh: 一对夫妇的 git config --global命令) ,最好是 RUN的脚本一次在您的 Dockerfile,但确保使用正确的用户(全局 git config文件是 %HOME%/.gitconfig,其中默认是 /root之一)

添加到 Dockerfile:

RUN /bootstrap.sh

然后,在运行容器时,检查 /root/.gitconfig的内容以确认脚本已经运行。

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

ADD script.sh /root/script.sh

在这种情况下,如果有的话,ADD必须在 CMD之前出现 顺便说一下,从主机导入脚本到容器中的任何位置都是一种很酷的方式

CMD位置 [./script]

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

您还可以将 WORKDIR指定为 /root,然后在启动容器时,您将被自动放置在 root 中

除了上面的答案之外:

如果您创建/编辑了您的。在 Windows 中的 sh 脚本文件中,请确保保存为以 Unix 格式 结尾的行。默认情况下,Windows 中的许多编辑器会将 Unix 行结尾转换为 Windows 格式,而 Linux 不会识别 shebang (# !/bin/sh)放在文件的开头。所以 Linux 会产生错误消息,比如如果没有 shebang。

小贴士:

  • 如果您使用记事本 + + ,您需要单击“ Edit/EOL Conversion/UNIX (LF)”
  • 如果您使用 VisualStudio,我建议您安装“ 终点站”插件。 然后可以通过按 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

用于在容器创建时运行 bash 脚本:

建立 script.sh档案:

#!/bin/bash
you commands

告示: 如果使用窗口,则必须更改 script.sh文件约定。 要做到这一点,使用记事本 + + ,转到编辑-> EOL 转换-> 从 CRLF 到 LF 的变化。 现在您的 bash 文件对于执行是有效的。

告示: 如果使用高山映像,则必须在 bash 文件的第一行使用 #!/bin/sh`` instead of # !/bin/bash“‘。

现在在 Dockerfile 中将 bash 文件复制到容器中,并在容器创建时使用 ENTRYPOINT指令运行该文件:

.
.
.


COPY script.sh /
RUN chmod +x /script.sh
.
.
.
ENTRYPOINT ["/script.sh"]

请注意,在 ENTRYPOINT指令中使用您映像中的 bash 文件地址。

现在,当您创建一个容器时,将执行 script.sh文件。