Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker &引用;环境";容器中未应用参数_Docker_Dockerfile - Fatal编程技术网

Docker &引用;环境";容器中未应用参数

Docker &引用;环境";容器中未应用参数,docker,dockerfile,Docker,Dockerfile,我只是在测试Docker,所以这可能是一个非常简单的问题,但我似乎无法找出为什么它没有达到我的预期 我为测试创建了一个非常简单的Dockerfile,只是为了构建一个简单的映像,用于安装一些包、克隆git repo并构建其需求: FROM ubuntu:18.04 ENV PYTHONEXEC=python3 \ PIPEXEC=pip \ VIRTUALENVEXEC=virtualenv \ GITREPO=https://github.com/test/test.

我只是在测试Docker,所以这可能是一个非常简单的问题,但我似乎无法找出为什么它没有达到我的预期

我为测试创建了一个非常简单的
Dockerfile
,只是为了构建一个简单的映像,用于安装一些包、克隆git repo并构建其需求:

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 .
到目前为止,这是可行的。但是,如果我在
docker container run
命令上指定
-e
参数,它似乎不会在上一个
run
命令中替换它

因此,如果我运行docker容器run-d-e“REPODIR=blah”gitapp,我希望它被克隆到
/app/blah
,但它仍然被克隆到
/app/test
目录中

当我运行一个
docker容器exec-it-e“REPODIR=blah”env
时,我得到:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2f6ba38341d6
TERM=xterm
REPODIR=blah
PYTHONEXEC=python3
PIPEXEC=pip
VIRTUALENVEXEC=virtualenv
GITREPO=https://github.com/test/test.git
HOME=/root

因此,似乎变量确实被传递给了容器。那么,为什么不将其传递到最后一个
RUN
命令,以便将repo克隆到正确的目录中呢?我缺少一些基本的东西吗?

当您执行
docker运行时,您正在指示容器执行Dockerfile的
CMD
入口点
命令。入口点上方的Dockerfile命令已在生成期间执行,并且在运行时不再执行

这正是将github repo克隆到最初在
Dockerfile
中定义的目录,而不是在带有
-e
标志的run命令中传递的目录的原因

解决方法是改变图像的入口点。你可以转让这部分

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\u to\u script/myscript.sh”]


但是,这有一个警告,即与当前设置相反,每次启动容器时都会执行脚本,这可能会导致延迟,具体取决于
myscript.sh
内容。

您好,我曾经遇到过类似的问题,但这是Kubernetes的问题,但我认为同样的概念也适用,我在我的代码中使用了一个ENV变量,该变量被设置为其中一个容器的一部分,但是,如果我再次修改ENV变量,它们不会反映在代码中,而是被视为容器的一部分,与您在
docker exec
中看到的方式相同,我认为您需要使用ENV变量构建映像,以便在构建映像时应用它们。当您使用
docker RUN
运行容器时,将执行
RUN
步骤,并且不再重新运行
RUN
命令。docker就是这样工作的,你构建了一个映像,然后用这个映像运行容器。你的意思是在运行时不可能这样做?必须使用结束时间参数强制创建图像?如果是这样的话,我看不出为什么
-e
选项存在于
docker container run
上……当您想要将环境变量传递给应该启动的容器时,需要
-e
选项。例如,您有一个具有属性文件的应用程序,您希望在运行容器时覆盖这些属性。我明白了,那么创建一个在每次运行时执行的
ENTRYPOINT
可以解决这个问题,将最后一个
run
命令迁移到
ENTRYPOINT