我需要在docker-compose.yml
中添加一些路径到我的PATH在docker-compose.yml中我试过
app:
...
environment:
- PATH /code/project
然而,这只会覆盖现有的PATH - 而我想添加到现有的PATH
答案 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
)构建的容器。而且您无法控制执行的命令。
我需要从(我们的)存储库下载的容器中使用此功能,而在这种情况下,这是行不通的。
我找到了使用entrypoint
和command
的解决方案。
让我们有一个基本容器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