docker-compose添加到PATH

时间:2016-01-08 09:29:43

标签: docker docker-compose

我需要在docker-compose.yml

中添加一些路径到我的PATH

在docker-compose.yml中我试过

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

然而,这只会覆盖现有的PATH - 而我想添加到现有的PATH

5 个答案:

答案 0 :(得分:14)

docker-compose.yml没有任何意义来扩展已经在Docker镜像中设置的环境变量。

我看到做这些事情的唯一方法是拥有一个Docker镜像,它需要一些环境变量(比如说ADDITONAL_PATH)并在运行时扩展它自己的{{1}用它来环境变量。

我们来看看以下 Dockerfile

PATH

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

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

构建图片:app: build: .

启动容器:docker-compose build,您将获得以下输出:

  

app_1 | ADDITIONAL_PATH是

     

app_1 | PATH是/ foo:/ bar:

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

docker-compose up

启动一个容器:app: build: . environment: - ADDITIONAL_PATH=/code/project ,您现在将获得以下输出:

  

app_1 | ADDITIONAL_PATH是/ code / project

     

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

另请注意 docker-compose.yml 文件中的语法错误:环境变量的名称与其值之间必须有等号(docker-compose up)字符。< / p>

=

而不是

environment:
    - PATH=/code/project

答案 1 :(得分:1)

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

通过docker-compose文件只能访问主机中的变量,因此不可能从docker-compose.yml扩展映像的PATH:

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

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

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

  app:
    build: .

并将ENV选项添加到 Dockerfile

  

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

在问题#684中建议这样做,我也建议您查看答案:docker ENV vs RUN export

答案 2 :(得分:0)

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

我需要从(我们的)存储库下载的容器中使用此功能,而在这种情况下,这是行不通的。

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

让我们有一个基本容器base和另一个基于它的java7。最后,使用java7容器运行某些东西,从而完成一些docker-compose。

这里最重要的文件可能是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:

$ 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

答案 3 :(得分:0)

您可以添加您的价值。 为此,您需要知道容器的名称或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的初始值中删除任何内容,而应对其进行扩展并添加新值。

答案 4 :(得分:-4)

在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