Добавить в 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