运行 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"
似乎没有任何效果。
你知道怎么做吗?
RUN
和 ENTRYPOINT
是执行脚本的两种不同方式。
RUN
表示它创建一个中间容器,运行s 脚本并在新的中间图像中冻结该容器的新状态。之后脚本将不会 运行:您的最终图像应该反映该脚本的结果。
ENTRYPOINT
表示您的映像(尚未执行脚本)将创建一个容器,并且 运行 是该脚本。
在这两种情况下,都需要添加脚本,RUN chmod +x /bootstrap.sh
是个好主意。
它也应该以 shebang 开头(如 #!/bin/sh
)
考虑到您的脚本(bootstrap.sh
:几个 git config --global
命令),最好在您的 Dockerfile
中 RUN
该脚本一次,但要确保使用正确的用户(全局 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
我在 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"
似乎没有任何效果。
你知道怎么做吗?
RUN
和 ENTRYPOINT
是执行脚本的两种不同方式。
RUN
表示它创建一个中间容器,运行s 脚本并在新的中间图像中冻结该容器的新状态。之后脚本将不会 运行:您的最终图像应该反映该脚本的结果。
ENTRYPOINT
表示您的映像(尚未执行脚本)将创建一个容器,并且 运行 是该脚本。
在这两种情况下,都需要添加脚本,RUN chmod +x /bootstrap.sh
是个好主意。
它也应该以 shebang 开头(如 #!/bin/sh
)
考虑到您的脚本(bootstrap.sh
:几个 git config --global
命令),最好在您的 Dockerfile
中 RUN
该脚本一次,但要确保使用正确的用户(全局 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