在Dockerfile中运行脚本


93

我正在尝试在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"

似乎没有任何作用。

你知道怎么做吗?


是否bootstarp.sh设置了可执行位?
jwodder

像这样运行chmod + x /bootstarp.sh吗?
凯文

2
对于“不起作用”,到底发生了什么?是否显示错误?图像中是否存在文件?如果您docker exec -it symfony bash在容器内,可以手动运行脚本并检查其内容吗?(cat bootstarp.sh)?
thaJeztah '16

试试这个:docker exec symfony /bin/bash /bootstarp.sh让我知道输出。
Boynux '16

12
Ermahgerd bootstarp!
布鲁诺·布罗诺斯基

Answers:


128

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

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

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

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

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

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

添加到您的Dockerfile中:

RUN /bootstart.sh

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


5
此外,您可能意味着bootstrap.sh代替bootstarp.sh:看stackoverflow.com/a/1254561/6309
VonC

凉!与RUN /bootstrap.sh搭配使用效果很好
Kevin

1
第一行的shebang为我做到了,谢谢!:)
GDICommander '02

33

除了以上答案:

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

提示:

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

4
哇,你救了我的一天。这次真是万分感谢。
mw

2
辉煌!这是我的确切问题!
Kevinsyel

1
我的VSCode已在Windows中自动将Shell脚本的行尾结尾设置为CRLF。由于某些随机字符,docker构建失败。我在VS Code中更改了设置,它立即开始工作。谢谢!我已经投票了。
Adithya Upadhya

24

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

ADD script.sh /root/script.sh

在这种情况下,ADD必须先进行操作CMD,如果您有一个BTW,将脚本从主机导入容器中任何位置的好方法

CMD地方[./script]

它应该自动执行您的脚本

您还可以指定WORKDIR/root,然后在启动容器时自动将其置于root用户


泊坞窗如何识别起初的script.sh在哪里?我的意思是,第一个参数是script.sh
日落

由于您正在建造集装箱,因此您还要负责放置路径
Michael

第一个参数的路径和名称script.sh相对于Dockerfile
eja

4

从本地文件系统复制到映像时,最好使用COPY代替ADD。另外,我建议创建一个子文件夹来放置您的内容。如果没有别的,它会使事情保持整洁。确保使用将脚本标记为可执行文件chmod

在这里,我正在创建一个scripts子文件夹来将我的脚本放入其中并从中运行它:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.