Docker将变量传入运行git clone

时间:2017-06-04 10:08:12

标签: git bash shell docker environment-variables

我正在创建一个Dockerfile,作为此文件的一部分,我想让最终用户可以选择传递他们的git repo。

我查看了this SO post以及其他几个网站,但我仍坚持使用git clone语法。

git clone命令返回错误,因为作为其一部分的变量在docker build阶段不包含值。

我有这个名为gitclone.sh的bash脚本

#!/bin/bash
git clone $1 /app

在我的Dockerfile中我有这一行:

RUN ./gitclone.sh $LOCATION

shell脚本具有正确的权限,可以在容器内运行时运行,因为我将实际的存储库传递给它。

在Docker构建阶段,我收到以下错误:

  

致命:存储库' / app'不存在

目录在那里,但$1为空,命令不起作用。

问题 如何使Dockerfile工作?我想要的所需输出:

docker run -e LOCATION=https://github.com/something.git -d jwknz/pg02

更新 将我的Dockerfile更改为包含 <{1}}代替CMD ["../gitclone.sh","$LOCATION"]无法解决问题。

Dockerfile将构建,但容器在运行RUN ./gitclone.sh $LOCATION命令后停止。

1 个答案:

答案 0 :(得分:1)

首先,您必须注意Dockerfile用于构建您的图像(使用docker build命令)并且docker run用于从已构建的docker启动容器图片。

您必须定义入口点脚本。这是一个脚本,每次从您使用Dockerfile构建的图像启动容器时执行该脚本。

假设您想要克隆git repo并在之后运行apache httpd,您可以在Dockerfile所在的同一文件夹中创建这样的脚本。将其命名为,例如gitCloneAndRunHttpd.sh

#!/bin/bash 

git clone $LOCATION /app 
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf 

然后你必须修改你的Dockerfile告诉docker将脚本文件复制到docker镜像,使其可执行,并告诉它在创建容器时运行它:

[...]

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

在此之后,使用docker build命令构建docker镜像,然后您可以从图像开始创建容器。

每次使用docker run -e LOCATION=https://github.com/some-git-repo.url -d your/image从中启动容器时,repo https://github.com/some-git-repo.url 将从容器内克隆到/ app文件夹,apache httpd将启动。

注意:如果您想知道您提到的SO post发生了什么,那么使用默认的入口点(/ bin / sh),/file.sh abc是传递给入口点的参数,因此执行file.sh脚本。