“ env”参数不适用于容器

时间:2019-07-15 09:52:43

标签: docker dockerfile

我只是在测试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命令,以便将存储库克隆到正确的目录中呢?我在这里缺少基本的东西吗?

1 个答案:

答案 0 :(得分:1)

当执行docker run时,您正在指示容器执行Dockerfile的CMDENTRYPOINT命令。位于入口点上方的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内容。