在Dockerfile

时间:2015-12-31 17:45:19

标签: docker 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"

似乎没什么用。

你知道怎么做吗?

5 个答案:

答案 0 :(得分:71)

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

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

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

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

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

开头

考虑你的脚本(KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh:几个git config --global命令),最好在Dockerfile中运行一次该脚本,但确保使用正确的用户(全局git配置)文件是%HOME%/。gitconfig,默认情况下是/ root one)

添加到your Dockerfile

RUN /bootstart.sh

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

答案 1 :(得分:20)

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

ADD script.sh /root/script.sh

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

CMD地方[./script]

它应该自动执行你的脚本

您也可以将WORKDIR指定为/root,然后在启动容器时自动将其置于root中

答案 2 :(得分:7)

除了以上答案:

如果您在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。

答案 3 :(得分:4)

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

在这里,我正在创建一个RUN mkdir -p /scripts COPY script.sh /scripts WORKDIR /scripts RUN chmod +x script.sh RUN script.sh 子文件夹,以将我的脚本放入并从其中运行:

{{1}}

答案 4 :(得分:0)

WORKDIR /scripts
ADD bootstrap.sh .
RUN ./bootstrap.sh