Загрузить файл конфигурации оболочки при запуске контейнера - PullRequest
0 голосов
/ 05 мая 2020

Проблема

Я хочу загружать пользовательский .zshrc всякий раз, когда я вхожу в контейнер docker с docker run -it container_name, учитывая, что файл .zshrc уже находится в контейнере.

Описание

У меня есть Dockerfile со следующей структурой:

FROM archlinux:latest

# Install things...
# Install zsh & oh-my-zsh
# Retrieve custom .zshrc from a repository and place it at ~/.zshrc
# Clone extensions for oh-my-zsh

# Run zsh on container start
CMD [ "zsh" ]

Все это работает. Если я вхожу в контейнер, я вижу, что мой собственный файл .zshrc находится там, где он должен быть, и если я запускаю source ~/.zshrc, он загружается и все расширения работают.

Попытка

I попытались получить файл конфигурации непосредственно на шаге CMD, но не смогли найти указанный файл. Обновленная строка выглядит следующим образом: CMD [ "zsh && source ~/.zshrc" ]

Я знаю, что это может быть не предполагаемый способ использования docker контейнеров, но это скорее опыт обучения, и я хотел посмотреть, можно ли это сделать.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

DOCKERFILE

Вам необходимо добавить команду chsh -s /path/to/shell, чтобы добавить оболочку ZSH по умолчанию для пользователя в контейнере:

FROM archlinux:latest

# Install things...
# Install zsh & oh-my-zsh
# Retrieve custom .zshrc from a repository and place it at ~/.zshrc
# Clone extensions for oh-my-zsh

# Make ZSH the default shell for the current user in the container
# To check that the shell was indeed added: `chsh -l` and you should see it in the  list.
RUN chsh -s ~/.zshrc

# Run zsh on container start
CMD [ "zsh" ]

ДРУГИЕ ПОДХОДЫ

Dockerfile CMD

Это не работает, потому что порядок выполнения:

CMD [ "zsh && source ~/.zshrc" ]

Но это должно работать (не проверено):

# using `root` user, adjust as needed for your case
CMD [ "source /root/.zshrc", "zsh"]

Docker Entrypoint

Если вы не хотите добавлять его в Dockerfile, используйте его в качестве точки входа:

docker run --rm -it --entrypoint "chsh -s /root/.zshrc" image-name

Обратите внимание, что в примере предполагается, что пользователь в контейнере root, отрегулируйте его в соответствии с вашим случаем.

1 голос
/ 05 мая 2020

Думаю, вам следует обновить содержимое $HOME/.profile. Вот пример.

.profile:

source .zshrc

.zshr c:

echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"
echo "I'm getting executed!!!!"

Dockerfile:

FROM ubuntu:18.04

RUN apt update \
    && apt install -yyq zsh curl git

RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

COPY .profile /root/.profile
COPY .zshrc /root/.zshrc

CMD ["zsh"]

Затем вы можете попробовать это с помощью

docker build -t zsh:latest .
docker run --rm -it zsh:latest

EDIT:

Если вы не хотите КОПИРОВАТЬ новый .profile, вы всегда можете добавить материал в существующий. например,

FROM ubuntu:18.04

RUN apt update \
    && apt install -yyq zsh curl git

RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

RUN curl -fsSL https://www/.zshrc -o /root/.yet_another_zshrc_file \
    && echo 'source /root/.yet_another_zshrc_file' | tee -a /root/.profile

CMD ["zsh"]
0 голосов
/ 05 мая 2020

Проблема не была полностью связана с Dockerfile. Да, поскольку @ Exadra37 упомянул, что CMD [ "zsh && source ~/.zshrc" ] не работает из-за порядка выполнения. Однако проблема была в моей конфигурации .zshrc.

После повторного тестирования на моей машине я понял, что она также не загружается автоматически.

Заключение

CMD [ "/bin/zsh" ], поскольку последняя строка в моем файле Docker автоматически загружает файл .zshrc, расположенный по адресу /root/.zshrc, мне просто нужно было убедиться, что мой файл конфигурации был написан правильно.

...