Я новачок у докері. Я виявив, що ми можемо встановлювати змінні середовища, використовуючи інструкцію ENV у файлі Docker. Але як можна встановити псевдоніми bash для довгих команд у Dockerfile?
Я новачок у докері. Я виявив, що ми можемо встановлювати змінні середовища, використовуючи інструкцію ENV у файлі Docker. Але як можна встановити псевдоніми 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
vi ~/.bash_aliases
source ~/.bash_aliases
Використовували деякі з наведених вище рішень, але псевдоніми досі не розпізнаються.
Я намагаюся встановити псевдоніми та використовувати їх як у подальших кроках 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