Как правильно написать переменную PATH в инструкции Docker ENV? - PullRequest
0 голосов
/ 28 сентября 2019

Я попытался создать образ докера и обнаружил, что у заданной мной переменной PATH есть некоторые проблемы.Минимальный нерабочий пример:

FROM ubuntu:latest

SHELL ["/bin/bash", "-cu"]
ARG CTAGS_DIR=/root/tools/ctags

 # Install common dev tools
RUN apt-get update --allow-unauthenticated \
  && apt-get install --allow-unauthenticated -y git curl autoconf pkg-config zsh

# Compile ctags
RUN cd /tmp \
  && git clone https://github.com/universal-ctags/ctags.git \
  && cd ctags \
  && ./autogen.sh \
  && ./configure --prefix=${CTAGS_DIR} \
  && make -j$(nproc) \
  && make install \
  && rm -rf /tmp/ctags
ENV PATH=$HOME/tools/ctags/bin:$PATH

RUN echo "PATH is $PATH"
RUN which ctags

В приведенном выше Dockerfile строка ENV PATH=$HOME/tools/ctags/bin:$PATH не работает должным образом.Кажется, что $HOME неправильно расширен.Следующие две инструкции также не работают:

ENV PATH=~/tools/ctags/bin:$PATH
ENV PATH="~/tools/ctags/bin:$PATH"

Только настройки абсолютного пути работают:

# the following setting works.
ENV PATH="/root/tools/ctags/bin:$PATH"

Я просмотрел ссылки на докер, но не могу найти документ об этом.

1 Ответ

1 голос
/ 28 сентября 2019

В общем, когда вы создаете образ Docker, все в порядке, чтобы установить вещи в обычные «системные» каталоги.Все, что вы строите, будет изолировано внутри изображения, и оно не может конфликтовать с другими инструментами.

Самый простой ответ на ваш ближайший вопрос состоит в том, чтобы расположить вещи так, чтобы вам не нужно было устанавливать $PATH.

В приведенном вами примере вы можете безопасно использовать каталог установки Autoconf по умолчанию /usr/local.Это почти наверняка будет пустым, когда вы начнете сборку образа, и там будут только те вещи, которые вы устанавливаете.

RUN ... \
 && ./configure \
 && make \
 && make install

(Следствие Python - не создавать виртуальную среду для вашего приложения; просто используйте систему pip чтобы установить вещи в каталоги библиотеки Python по умолчанию.)

Не ожидайте, что будет домашний каталог.Если вам нужно установить приложение в нестандартном месте, /app является обычным, а /opt/whatever соответствует практике, не связанной с Docker Linux.Избегайте $HOME или ~, они, как правило, не очень четко определены в Docker (если вы не сделаете из них все возможное, чтобы заставить их быть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...