programing

Dockerfile에서 도커 컨테이너의 Bash 별칭을 설정하려면 어떻게 해야 합니까?

easyjava 2023. 4. 19. 23:37
반응형

Dockerfile에서 도커 컨테이너의 Bash 별칭을 설정하려면 어떻게 해야 합니까?

도커는 처음입니다.Dockerfile의 ENV 명령을 사용하여 환경변수를 설정할 수 있다는 것을 알게 되었습니다.하지만 Dockerfile에서 긴 명령어에 대해 Bash 에일리어스를 설정하려면 어떻게 해야 할까요?

기본적으로 항상 그렇듯이 사용자 파일에 추가합니다.

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>

컨테이너 내부가 아닌 Dockerfile 내에서만 에일리어스를 사용하는 경우 가장 짧은 방법은 선언입니다.

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 파일에 추가했습니다.

# Set up 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 file: 커스텀에일리어스를 추가할 뿐. .timeoutrc 파일의 소스는 필요 없습니다.

# Add the Bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc

효과가 있었다!

또 다른 옵션은 컨테이너 외부에서 "docker exec -it < container - name > 명령어를 사용하여 사용자 고유의 .bashrc 또는 .bash_profile 파일(원하는 파일)을 사용하는 것입니다.

예.,

docker exec -it docker_app_1 bash

가장 쉬운 방법은 에일리어스가 포함된 파일을 컨테이너에 마운트하고 Bash가 찾을 위치를 지정하는 것입니다.

docker run \
    -it \
    --rm \
    -v ~/.bash_aliases:/tmp/.bash_aliases \
    [image] \
    /bin/bash --init-file /tmp/.bash_aliases

사용 예:

echo 'alias what="echo it works"' > my_aliases
docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
alias

출력:

alias what='echo it works'
what

출력:

it works

ENTRIPOINT를 사용할 수 있지만 Docker 파일에서 별칭에 대해서는 작동하지 않습니다.

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 함수입니다.

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

이전 솔루션 중 일부를 사용했지만 여전히 별칭이 인식되지 않습니다.

에일리어스를 설정하고 나중에 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 스크립트와 조합하여 사용했습니다.이 스크립트는 종속성이 Pong되어 Bash 소스를 설정하고 몇 가지 ENV 변수를 더 설정하여 더 많은 명령을 파이프에 연결할 수 있도록 합니다.

@ErikDannberg의 답변은 효과가 있었지만, 나의 경우는 몇 가지 조정이 필요했다.

가명에는 통하지 않았어요 쌍방향 셸에 문제가 있는 것 같아요

나는 그의 두 번째 해결책을 찾았지만, 여전히 효과가 없었다. 셸 = 프프) ( ( = )첫첫첫첫첫첫 =)가 눈에 .#!/usr/bin/env sh와 조금 .#!/usr/bin/bash그렇게 바꾸고 나서 제 기능을 하기 시작했어요.t ★★★★★★★★★★★★★★★★★」tc'라고 했는데, '에일리어스'를 얻기 의 두 tf일하기 위해.

여기 도커 파일 전문이 있습니다.

FROM php:8.1.1-fpm-alpine AS build

RUN apk update && apk add git

RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer

RUN apk add --no-cache $PHPIZE_DEPS \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && touch /usr/local/etc/php/conf.d/99-xdebug.ini \
    && echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/99-xdebug.ini \
    && echo -e '#!/usr/bin/env sh\nphp artisan test' > /usr/bin/t \
    && chmod +x /usr/bin/t \
    && echo -e '#!/usr/bin/env sh\nphp artisan test --coverage' > /usr/bin/tc \
    && chmod +x /usr/bin/tc \
    && echo -e '#!/usr/bin/env sh\nphp artisan test --filter "$@"' > /usr/bin/tf \
    && chmod +x /usr/bin/tf

WORKDIR /var/www

언급URL : https://stackoverflow.com/questions/36388465/how-can-i-set-bash-aliases-for-docker-containers-in-dockerfile

반응형