Dockerfile에서 Docker 컨테이너에 대한 bash 별칭을 설정하는 방법은 무엇입니까?


85

나는 도커를 처음 사용합니다. Dockerfile에서 ENV 명령을 사용하여 환경 변수를 설정할 수 있음을 발견했습니다. 그러나 Dockerfile에서 긴 명령에 대한 bash 별칭을 어떻게 설정합니까?


별명은 본질적를 위해 사용되지 않는 것으로 간주되어 매우 긴 시간입니다. 기능을 사용하십시오. 할 필요가 더 이상 없다 별칭을 사용. 80 년대 후반의 이러한 접근 방식이 어떻게 그렇게 오래 지속됩니까?
William Pursell

19
물론 편리하고 간단하기 때문입니다.
아서

13
@WilliamPursell 아마도 대신 함수를 사용하는 방법을 설명해야 할 것입니다.
에릭 델라 크루즈

2
별칭은 간단하고 편리하며 깨지기 쉽고 오류가 발생하기 쉽습니다. 기능은 사용하기 쉽지만 더 많은 유연성과 견고성을 제공합니다. 사용 방법에 대한 많은 리소스가 있습니다.
William Pursell

답변:


141

기본적으로 항상 그렇듯이 사용자의 .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

감사합니다. 비대화 형 쉘의 예를 제공 할 수 있습니까? 나는이 해결하기 위해 엔트리 포인트와 CMD를 찾고 있었다
c24b

5
Bash 별칭은 대화 형 셸에서만 작동합니다. 작은 셸 스크립트를 만들고 별칭과 동일한 효과를 경로에 넣으십시오. 간단한 예제로 답변을 업데이트했습니다.
Erik Dannenberg 2016

1
참고 : stackoverflow.com/a/8467449 에서 보다 일관된 동작을 보장하려면 echo 대신 printf 를 사용해야합니다 . 그래서 printf '#! / bin / bash \ necho hello'> / usr / bin / hi chmod + x / usr / bin / hi
barraq

2
쉘 스크립트 아이디어를 좋아하십시오. 별칭을 추가하려고했지만 훨씬 낫습니다. 감사.
Blizz

3
여러 인수를 이스케이프하려면 $ * 대신 "$ @"를 사용해야합니다. unix.stackexchange.com/questions/248464/…
gnou

14

기존 명령의 별칭을 만들려면 ln -s다음 을 사용할 수도 있습니다 .

ln -s $(which <existing_command>) /usr/bin/<my_command>


6
나는 이것을 별칭이라고 부르지 않을 것이다. 그것은 소프트 링크 / 심볼릭 링크이다. 별칭의 편리함은 alias ll='ls -lh'심볼릭 링크로는 불가능한 명령에 매개 변수를 전달할 수 있다는 것 입니다.
qwertz

3

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

대부분의 경우 건물 단계에서 별칭을 사용하고 컨테이너 내부로 들어 가지 않으므로 첫 번째 예는 매일 사용하는 데 더 빠르고 명확하며 간단합니다.


2

방금 내 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


1

진입 점을 사용할 수 있지만 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 "$@"

(빠른 복사 / 붙여 넣기, 죄송합니다)


일부 Docker 이미지는 이미 기본 진입 점 (예 : phusion 기본 이미지)을 재정의 할 수 있습니다.
Thomas Decaux 2016

1

가장 쉬운 방법은 별칭을 포함하는 컨테이너에 파일을 마운트 한 다음 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

0
  1. 이 파일을 편집하십시오 ~ / .bash_aliases vi ~/.bash_aliases
  2. 소스이 파일 ~ / .bash_aliases source ~/.bash_aliases
  3. 끝난.

도커 컨테이너를 스핀 업할 때마다 괜찮지 만 별칭은 다음 번에 유지되지 않습니다. 이 솔루션이 괜찮을 때마다 다시 추가해도 상관 없습니다.
mikoop

0

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

별칭을 설정하고 나중에 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도 사용할 수 있었지만 더 많은 시나리오에서는 빌드 단계와 나중에 런타임에 별칭이 필요했습니다.

종속성이 퐁 (pong)되고 bash 소스를 설정하고, 더 많은 env 변수를 설정하고, 추가 명령을 파이프 할 수 있도록 허용하는 bash 스크립트와 함께 ENV 변수를 사용했습니다.


모든 RUN명령은 새 셸에서 실행되므로 예제에서 별칭을 사용하려고 할 때 더 이상 별칭 파일이로드되지 않습니다.
Erik Dannenberg

100 % @ErikDannenberg 댓글에 감사 드리며이 업데이트를 게시해야 함을 상기시켜 주셔서 감사합니다. 해결책을 찾았으며 귀하가 제안한 것과 매우 흡사합니다.
alanionita

0

다음은 대화식으로 사용하는 모든 컨테이너에 별칭을 포함하는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.