【发布时间】:2016-04-12 22:17:37
【问题描述】:
我需要在 docker-compose.yml 中添加一些路径到我的 PATH
在 docker-compose.yml 我试过了
app:
...
environment:
- PATH /code/project
但是这只是覆盖了现有的 PATH - 而我想添加到现有的 PATH
【问题讨论】:
标签: docker docker-compose
我需要在 docker-compose.yml 中添加一些路径到我的 PATH
在 docker-compose.yml 我试过了
app:
...
environment:
- PATH /code/project
但是这只是覆盖了现有的 PATH - 而我想添加到现有的 PATH
【问题讨论】:
标签: docker docker-compose
在 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 主机系统和您的 docker 映像上不一样,是巧合吗?
docker-compose 的主机中的值。相同的PATH 存在于容器中这一事实并不意味着以 OP 描述的方式“它有效”。尝试在主机 shell 中向 PATH 添加值,然后运行 docker-compose。您会看到它们出现在容器 PATH 中。然后尝试在您的主机外壳中清除PATH,您会发现它不再“工作”。此外,使用env_file 执行此操作只会将$PATH 解释为字符串文字。
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。
@Thomasleveil 的答案仅适用于直接从 docker-compose 文件构建的容器(通过build)。而且你无法控制执行的命令。
对于从(我们的)存储库下载的容器,我需要此功能,但该功能不太适用。
我找到了使用entrypoint 和command 的解决方案。
让我们有一些基础容器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
【讨论】:
我知道这是一个旧线程,但我认为有几件事可以澄清。
通过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。
【讨论】:
您可以增加您的价值。 为此,您需要知道容器的名称或 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 的初始值中删除任何内容,只需对其进行扩展并添加新值即可。
【讨论】: