【问题标题】:docker-compose adding to PATHdocker-compose 添加到 PATH
【发布时间】:2016-04-12 22:17:37
【问题描述】:

我需要在 docker-compose.yml 中添加一些路径到我的 PATH

在 docker-compose.yml 我试过了

app:
    ...
    environment:
        - PATH /code/project

但是这只是覆盖了现有的 PATH - 而我想添加到现有的 PATH

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    在 docker-compose.yml 文件中向 PATH 添加一个位置:

    app
        environment:
            - PATH=/code/project:$PATH
    

    在 docker-compose.yml 文件中向 PATH 添加多个位置

    app
        environment:
            - PATH=/code/project:/code/lib:/foo/bar:$PATH
    

    添加到您的 PYTHONPATH

    app
        environment:
            - PYTHONPATH=/code/project:/code/lib:/foo/bar
    

    【讨论】:

    • 这里的 $PATH 将被替换为在您运行 docker-compose 命令的机器上定义的值。这不会像在 docker 映像中那样扩展原始 PATH 环境变量的值。
    • 您确定 PATH 值在您的 docker 主机系统和您的 docker 映像上不一样,是巧合吗?
    • 对不起,我认为它不起作用,请参阅this gist,在 CentOS 6.7 上使用 docker-compose v1.5.2
    • @Thomasleveil 是正确的。这只是使用运行docker-compose 的主机中的值。相同的PATH 存在于容器中这一事实并不意味着以 OP 描述的方式“它有效”。尝试在主机 shell 中向 PATH 添加值,然后运行 ​​docker-compose。您会看到它们出现在容器 PATH 中。然后尝试在您的主机外壳中清除PATH,您会发现它不再“工作”。此外,使用env_file 执行此操作只会将$PATH 解释为字符串文字。
    • 我使用 Docker for Windows 运行 Windows 映像的经验是,@Thomasleveil 是正确的。
    【解决方案2】:

    docker-compose.yml 不会为您提供任何方法来扩展已经在 Docker 映像中设置的环境变量。

    我认为做这些事情的唯一方法是拥有一个 Docker 映像,该映像需要一些环境变量(比如说 ADDITONAL_PATH)并扩展在运行时它自己的 PATH 环境变量它。


    我们来看看下面的Dockerfile

    FROM busybox
    ENV PATH /foo:/bar
    CMD export PATH=$PATH:$ADDITIONAL_PATH; /bin/echo -e "ADDITIONAL_PATH is $ADDITIONAL_PATH\nPATH is $PATH"
    

    以及以下 docker-compose.yml 文件(与 Dockerfile 位于同一目录中):

    app:
      build: .
    

    构建镜像:docker-compose build

    并启动一个容器:docker-compose up,你会得到如下输出:

    app_1 | ADDITIONAL_PATH 是

    app_1 |路径是 /foo:/bar:

    现在将 docker-compose.yml 文件更改为:

    app:
      build: .
      environment:
        - ADDITIONAL_PATH=/code/project
    

    并启动一个容器:docker-compose up,您现在将得到以下输出:

    app_1 | ADDITIONAL_PATH 是 /code/project

    app_1 | PATH 是 /foo:/bar:/code/project


    还要注意 docker-compose.yml 文件中的语法错误:环境变量的名称和它的值之间必须有一个等号 (=) 字符。

    environment:
        - PATH=/code/project
    

    而不是

    environment:
        - PATH /code/project
    

    【讨论】:

    • 这也适用于Dockerfile: `ENV="/my/new/path"${PATH}"。请注意引号很重要。我建议将此添加到您的答案中。见this post
    【解决方案3】:

    @Thomasleveil 的答案仅适用于直接从 docker-compose 文件构建的容器(通过build)。而且你无法控制执行的命令。

    对于从(我们的)存储库下载的容器,我需要此功能,但该功能不太适用。

    我找到了使用entrypointcommand 的解决方案。

    让我们有一些基础容器base 和另一个基于它的java7。最后一些 docker-compose 使用java7 容器来运行一些东西。

    可能是这里最重要的文件,entrypoint.sh

    $ cat base/script/entrypoint.sh
    #!/bin/bash
    
    export PATH="$PATH_ADD:$PATH"
    echo "Path modified to $PATH"
    exec $@
    

    base 容器的 Dockerfile

    $ cat base/Dockerfile
    FROM xxx
    # copy entrypoint script that extends current PATH variable by PATH_ADD
    COPY script/entrypoint.sh /usr/sbin
    
    ENTRYPOINT ["/usr/sbin/entrypoint.sh"]
    

    java7 容器的 Dockerfile

    $ cat java7/Dockerfile
    FROM base
    # download java7
    curl ... /opt/java/jdk7
    ENV JAVA_HOME /opt/java/jdk7
    

    docker-compose 运行的命令

    $ cat sbin/run-app1.sh
    exec $JAVA_HOME/bin/java -version
    
    $ cat sbin/run-app2.sh
    exec $JAVA_HOME/bin/java -version
    

    Docker-compose 使用这些:

    $ cat docker-compose.yml
    version: '3'
    services:
      app1:
        image: java7
        command: run-app1.sh
        environment:
          PATH_ADD: /app/sbin
        volumes:
          - "./sbin:/app/sbin:cached"
      app2:
        image: java7
        command: run-app2.sh
        environment:
          PATH_ADD: /app/sbin
        volumes:
          - "./sbin:/app/sbin:cached"
    

    文件结构

    $ tree
    .
    ├── base
    │   ├── script
    │   │   └── entrypoint.sh
    │   └── Dockerfile
    ├── java7
    │   └── Dockerfile
    ├── sbin
    │   ├── run-app1.sh
    │   └── run-app2.sh
    └── docker-compose.yml
    

    【讨论】:

    • run-app1.sh 在 tree 命令中被错误地列出了两次。第二个应该是 run-app2.sh
    【解决方案4】:

    我知道这是一个旧线程,但我认为有几件事可以澄清。

    通过docker-compose 文件,一个只能寻址来自主机的变量,因此不可能从 docker-compose.yml 扩展图像的 PATH:

    app:
        ...
        environment:
            - PATH=/code/project:$PATH
    

    另一方面,使用 RUN 或 CMD EXPORT 指令是不够的,因为 EXPORTED 变量不会在图像中持续存在。由于每个 Dockerfile 指令都会生成一个中间映像,因此这些值将反映在它们中,而不是在您实际需要它们的主映像中。

    最好的选择是在docker-compose.yml 中使用构建选项:

      app:
        build: .
    

    并将 ENV 选项添加到 Dockerfile

    ENV PATH /path/to/bin/folder:$PATH

    这是问题#684 中的建议,我还建议查看答案:docker ENV vs RUN export

    【讨论】:

      【解决方案5】:

      您可以增加您的价值。 为此,您需要知道容器的名称或 ID,运行它即可知道:

      docker ps
      

      这将打印所有正在运行的容器的详细信息。查找您的容器并复制其 ID 或名称。然后运行:

      docker inspect <container ID>
      

      它将打印指定容器的所有值。查找 ENV 部分并找到 PATH 环境变量。然后复制它的值,添加你的更改并用你的新值扩展它,然后在你的 docker-compose.yml “环境”部分再次设置它。

      app
      environment:
          - PATH=value-you-copied:new-value:new-value:etc
      

      请注意,您不应从 PATH 的初始值中删除任何内容,只需对其进行扩展并添加新值即可。

      【讨论】:

        猜你喜欢
        • 2017-09-27
        • 2020-12-21
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        相关资源
        最近更新 更多