Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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_Docker Compose - Fatal编程技术网

Docker运行持久化环境变量?

Docker运行持久化环境变量?,docker,docker-compose,Docker,Docker Compose,当我运行此程序时,它会打印: FROM bitnami/minideb:latest RUN . /etc/os-release RUN echo "code1=${VERSION_CODENAME}" RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}" 是否有某种方法可以在运行命令和/或从容器内的文件加载环境变量的单独命令之间持久保存环境变量?简而言之 使用ENV将环境变量设置为图像 或者source您的en

当我运行此程序时,它会打印:

FROM bitnami/minideb:latest

RUN . /etc/os-release
RUN echo "code1=${VERSION_CODENAME}"
RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}"
是否有某种方法可以在运行命令和/或从容器内的文件加载环境变量的单独命令之间持久保存环境变量?

简而言之

  • 使用
    ENV
    将环境变量设置为图像
  • 或者
    source
    您的env文件位于
    docker run
这是您的Dockerfile:

code1=
code2=buster
根据docker文件,docker引擎将解释如下说明:

  • 运行/etc/os-release
    :从image
    bitnami/minideb:latest
    source
    文件
    /etc/os-release
    启动一个中间容器,然后将此容器提交到一个id为的映像(比如
    ab12
  • 运行echo“code1=${VERSION\u CODENAME}”
    :从映像
    ab12
    启动另一个中间容器,该容器在上一步中提交。docker引擎在此容器中运行
    echo“code1=${VERSION\u CODENAME}”
    ,然后将其提交到另一个映像
    cd34
  • 与2相同。但是
    source
    echo
    在同一个中间容器中执行
  • 显然,在步骤1和2中,
    source
    echo
    命令在不同的容器中运行,这就是您无法获取所需变量的原因

    因此,
    ENV
    指令是解决问题的推荐方法。但如果您真的需要从文件中读取ENV,这里有一个解决方法

  • 准备一个名为
    my env.sh
    的文件:
  • #/bin/bash
    导出ENV1=XXX
    导出ENV2=XXX
    # ...
    
  • 准备一个名为
    entrypoint.sh的文件
  • #/bin/bash
    . /my-env.sh
    #在将此图像启动到容器中时要执行的其他操作
    
  • 准备Dockerfile:
  • 通过
    docker build-t.
    生成映像。在生成映像之前,当前工作目录应包含:
    • my-env.sh
    • entrypoint.sh
    • Dockerfile

  • 祝你好运

    我认为您不能:那么
    ENV TESTDATE=`date`
    呢?问题是环境变量来自我正在使用的图像的内部。我运行的是
    :latest
    ,因此操作系统的代码名可能会随着时间的推移而改变。这就是我不想硬编码的原因。否则我只会使用
    ENV
    ENTRYPOINT
    是否在其他
    命令运行之前运行。。?如果是这样的话,那就可以了。不,
    ENTRYPOINT
    将不会在Dockerfile中的任何指令之前执行。只有在将映像启动到容器中时,才会执行该操作。
    FROM bitnami/minideb:latest
    
    RUN . /etc/os-release
    RUN echo "code1=${VERSION_CODENAME}"
    RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}"
    
    FROM bitnami/minideb:latest
    
    # copy files from local to image
    COPY my-env.sh /my-env.sh
    COPY entrypoint.sh /entrypoint.sh
    
    # when start this image into a container, execute the following command
    ENTRYPOINT ["bash", "/entrypoint.sh"]