나는 도커를 처음 사용합니다. Dockerfile에서 ENV 명령을 사용하여 환경 변수를 설정할 수 있음을 발견했습니다. 그러나 Dockerfile에서 긴 명령에 대한 bash 별칭을 어떻게 설정합니까?
나는 도커를 처음 사용합니다. Dockerfile에서 ENV 명령을 사용하여 환경 변수를 설정할 수 있음을 발견했습니다. 그러나 Dockerfile에서 긴 명령에 대한 bash 별칭을 어떻게 설정합니까?
답변:
기본적으로 항상 그렇듯이 사용자의 .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
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도 사용할 수 있었지만 더 많은 시나리오에서는 빌드 단계와 나중에 런타임에 별칭이 필요했습니다.
종속성이 퐁 (pong)되고 bash 소스를 설정하고, 더 많은 env 변수를 설정하고, 추가 명령을 파이프 할 수 있도록 허용하는 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