我正在创建一个Dockerfile,作为这个文件的一部分,我想给最终用户提供传递他们的git repo的选项.
我查看了this SO post和其他一些网站,但我坚持使用git clone语法.
git clone命令返回错误,因为作为其一部分的变量在docker构建阶段不包含值.
我有这个名为gitclone.sh的bash脚本
#!/bin/bash
git clone $1 /app
在我的Dockerfile中我有这一行:
RUN ./gitclone.sh $LOCATION
shell脚本具有正确的权限,可以在容器内运行时运行,因为我将实际的存储库传递给它.
在Docker构建阶段,我收到以下错误:
fatal: repository ‘/app’ does not exist
该目录在那里,但$1是空的命令不起作用.
题
如何使Dockerfile工作?我想要的所需输出:
docker run -e LOCATION = https://github.com/something.git -d jwknz / pg02
UPDATE
将我的Dockerfile更改为包含
CMD [“../gitclone.sh\”,\”$LOCATION”]而不是RUN ./gitclone.sh $LOCATION无法修复它.
Dockerfile将构建,但容器在运行docker run命令后停止.
最佳答案 首先,您必须注意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你的/ image启动一个容器时,repo https://github.com/some-git-repo.url将从容器内克隆到/ app文件夹和apache httpd将启动.
注意:如果您想知道您提到的SO post中发生了什么,那么使用默认入口点(/ bin / sh),而/ file.sh abc是传递给该入口点的参数,因此file.sh脚本是执行.