我只是在测试Docker,所以这可能是一个非常简单的问题,但我似乎无法找出为什么它没有达到我的期望。
我创建了一个非常简单的}
进行测试,只是为了构建一个简单的映像来安装一些软件包,克隆git repo并建立其需求:
\{b\s+([^{}]*)}
然后我用以下图像构建图像:
b
到目前为止,该方法有效。但是,如果我在}
命令上指定了Dockerfile
参数,则似乎没有在最后一个FROM ubuntu:18.04
ENV PYTHONEXEC=python3 \
PIPEXEC=pip \
VIRTUALENVEXEC=virtualenv \
GITREPO=https://github.com/test/test.git \
REPODIR=test
RUN apt-get update && apt-get install -y git \
python3 \
python3-dev \
python3-virtualenv \
python-virtualenv \
qt5-default \
libcurl4-openssl-dev \
libxml2 \
libxml2-dev \
libxslt1-dev \
libssl-dev \
virt-viewer
RUN mkdir -p /app
WORKDIR /app
RUN git clone $GITREPO $REPODIR \
&& $VIRTUALENVEXEC -p $PYTHONEXEC venv \
&& . venv/bin/activate \
&& cd $REPODIR \
&& $PIPEXEC install -r requirements.txt
CMD ["sleep", "1000000"]
命令中替换它。
因此,如果我运行docker build -t gitapp:latest .
,我希望它会被克隆到-e
中,但仍会被克隆到docker container run
目录中。
运行RUN
会得到:
docker container run -d -e "REPODIR=blah" gitapp
因此,似乎变量确实已传递到容器。那么,为什么不将其传递给最后一个/app/blah
命令,以便将存储库克隆到正确的目录中呢?我在这里缺少基本的东西吗?
答案 0 :(得分:1)
当执行docker run
时,您正在指示容器执行Dockerfile的CMD
或ENTRYPOINT
命令。位于入口点上方的Dockerfile命令已在构建期间执行,并且在运行时不再执行。
这正是将您的github存储库克隆到最初在Dockerfile
定义的目录中而不是在运行命令中带有-e
标志传递的目录中克隆的原因。
一种解决方法是更改图像的入口点。您可以转移这部分
RUN git clone $GITREPO $REPODIR \
&& $VIRTUALENVEXEC -p $PYTHONEXEC venv \
&& . venv/bin/activate \
&& cd $REPODIR \
&& $PIPEXEC install -r requirements.txt
到bash脚本文件(我们称其为my.script.sh
)文件,该文件将作为图像的入口点执行。在构建过程中,将文件复制到首选位置,以确保它包含可执行标志并相应地编辑Dockerfile
的入口点:
CMD ["/path_to_script/myscript.sh" ]
但是有一个警告:与您当前的设置相比,每次启动容器时都会执行该脚本,这可能会导致延迟,具体取决于myscript.sh
内容。