Добавить в PATH
Мне нужно добавить несколько путей к моему PATH в файле docker-compose.yml
в docker-compose.yml Я пробовал
app:
...
environment:
- PATH /code/project
однако, что просто перезаписывает существующий PATH - тогда как я хочу добавить к существующей PATH
Ответы
Ответ 1
чтобы добавить одно место в PATH в файле docker-compose.yml:
app
environment:
- PATH=/code/project:$PATH
добавить несколько мест в ваш PATH в файле docker-compose.yml
app
environment:
- PATH=/code/project:/code/lib:/foo/bar:$PATH
чтобы добавить к вашему PYTHONPATH
app
environment:
- PYTHONPATH=/code/project:/code/lib:/foo/bar
Ответ 2
A docker-compose.yml
не предлагает вам какого-либо значения для расширения переменной среды, которая уже была бы установлена в изображении Docker.
Единственное, что я вижу для этого, - это иметь изображение Docker, которое ожидает некоторую переменную среды (скажем, ADDITONAL_PATH
) и расширяет во время выполнения свою собственную переменную окружения PATH
с помощью < он.
Возьмем следующий файл Docker:
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(в том же каталоге, что и файл Docker):
app:
build: .
Постройте изображение: docker-compose build
И запустите контейнер: docker-compose up
, вы получите следующий вывод:
app_1 | ADDITIONAL_PATH
app_1 | PATH is/foo:/bar:
Теперь измените файл docker-compose.yml на:
app:
build: .
environment:
- ADDITIONAL_PATH=/code/project
И запустите контейнер: docker-compose up
, теперь вы получите следующий вывод:
app_1 | ADDITIONAL_PATH is/code/project
app_1 | PATH is/foo:/bar:/code/project
Также обратите внимание на синтаксическую ошибку в файле docker-compose.yml: между именем переменной среды и ее значением должен быть знак равенства (=
).
environment:
- PATH=/code/project
вместо
environment:
- PATH /code/project
Ответ 3
Я знаю, что это старая ветка, но я думаю, что есть пара вещей, которые можно уточнить.
Через файл docker-compose
можно обращаться только к переменным с хост-машины, поэтому невозможно расширить PATH образа из docker-compose.yml:
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.
Ответ 4
Ответ @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 [email protected]
Dockerfile для base
контейнера
$ 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"]
Dockerfile для контейнера java7
$ 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