Я новичок в докере. Я обнаружил, что мы можем установить переменные среды с помощью инструкции ENV в Dockerfile. Но как установить псевдонимы bash для длинных команд в Dockerfile?
Я новичок в докере. Я обнаружил, что мы можем установить переменные среды с помощью инструкции ENV в Dockerfile. Но как установить псевдонимы bash для длинных команд в Dockerfile?
Ответы:
В принципе, как и всегда, добавив его пользователю .bashrc
:
FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc
Как обычно, это работает только для интерактивных оболочек:
docker build -t test .
docker run -it --rm --entrypoint /bin/bash test hi
/bin/bash: hi: No such file or directory
docker run -it --rm test bash
$ hi
hello
Для неинтерактивных оболочек вы должны создать небольшой скрипт и поместить его в свой путь, то есть:
RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Если ваш псевдоним использует параметры (например, hi Jim
-> hello Jim
), просто добавьте "$@"
:
RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Чтобы создать псевдоним существующей команды, также можно использовать ln -s
:
ln -s $(which <existing_command>) /usr/bin/<my_command>
alias ll='ls -lh'
что невозможно с символическими ссылками.
Если вы хотите использовать псевдонимы только в Dockerfile, но не внутри контейнера, то самый короткий способ - это ENV
объявление:
ENV update='apt-get update -qq'
ENV install='apt-get install -qq'
RUN $update && $install apt-utils \
curl \
gnupg \
python3.6
И для использования в контейнере, как уже описано:
RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
RUN chmod +x /usr/bin/install
В большинстве случаев я использую псевдонимы только на этапе сборки и не захожу внутрь контейнеров, поэтому первый пример быстрее, понятнее и проще для повседневного использования.
Я только что добавил это в свой файл app.dockerfile
# setup aliases
ADD ./bashrc_alias.sh /usr/sbin/bashrc_alias.sh
ADD ./initbash_profile.sh /usr/sbin/initbash_profile
RUN chmod +x /usr/sbin/initbash_profile
RUN /bin/bash -C "/usr/sbin/initbash_profile"
и внутри, initbash_profile.sh
который просто добавляет мои пользовательские псевдонимы и нет необходимости исходить из файла .bashrc.
# add the bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc
работал угощение!
Другой вариант - просто использовать команду docker exec -it извне контейнера и просто использовать свой собственный .bashrc или .bash_profile (что бы вы ни выбрали)
например. docker exec -it docker_app_1 bash
Вы можете использовать точку входа, но она не будет работать с псевдонимом в вашем Dockerfile:
ADD dev/entrypoint.sh /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]
Твой entrypoint.sh
#!/bin/bash
set -e
function dev_run()
{
}
export -f dev_run
exec "$@"
(Быстрое копирование / вставка, извините)
Я думаю, что самый простой способ - смонтировать файл в ваш контейнер, содержащий ваши псевдонимы, а затем указать, где bash должен его найти:
docker run \
-it \
--rm \
-v ~/.bash_aliases:/tmp/.bash_aliases \
[image] \
/bin/bash --init-file /tmp/.bash_aliases
Пример использования:
user@cobalt:~$ echo 'alias what="echo it works"' > my_aliases
user@cobalt:~$ docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
root@565e4a1bdcc0:/# alias
alias what='echo it works'
root@565e4a1bdcc0:/# what
it works
Использованы некоторые из вышеперечисленных решений, но псевдонимы до сих пор не распознаются.
Я пытаюсь установить псевдонимы и использовать их как в последующих шагах Dockerfile, так и в контейнере во время выполнения.
RUN echo "alias model-downloader='python3 ${MODEL_DL_PATH}/downloader.py'" >> ~/.bash_aliases && \
echo "alias model-converter='python3 ${MODEL_DL_PATH}/converter.py'" >> ~/.bash_aliases && \
source ~/.bash_aliases
# Download the model
RUN model-downloader --name $MODEL_NAME -o $MODEL_DIR --precisions $MODEL_PRECISION;
Для меня решением было использовать переменные ENV, содержащие пути к папкам, а затем добавить точный исполняемый файл. Я мог бы также использовать ARG, но для большинства моих сценариев мне нужны псевдонимы как на этапе сборки, так и позже во время выполнения.
Используются переменные ENV в сочетании со сценарием bash, который запускается после того, как зависимости установлены, и устанавливает источник bash, устанавливает еще несколько переменных env и позволяет передавать дальнейшие команды.
RUN
инструкция выполняется в новой оболочке, поэтому в вашем примере файл псевдонима больше не загружается, когда вы пытаетесь использовать псевдоним.
Вот функция Bash, чтобы ваши псевдонимы были в каждом контейнере, который вы используете в интерактивном режиме.
ducker_it() {
docker cp ~/bin/alias.sh "$1":/tmp
docker exec -it "$1" /bin/bash -c "[[ ! -f /tmp/alias.sh.done ]] \
&& [[ -w /root/.bashrc ]] \
&& cat /tmp/alias.sh >> /root/.bashrc \
&& touch /tmp/alias.sh.done"
docker exec -it "$1" /bin/bash
}
Обязательный шаг до:
grep ^alias ~/.zshrc > ~/bin/alias.sh
vi ~/.bash_aliases
source ~/.bash_aliases