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
'programing' 카테고리의 다른 글
| bash/shell 스크립트에서 http 응답 코드를 평가하는 방법 (0) | 2023.04.19 |
|---|---|
| UITableView셀을 선택한 색상? (0) | 2023.04.19 |
| Git 브랜치를 로컬 및 원격으로 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
| .gitignore에 나열되어 있지만 저장소에 있는 파일을 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
| CSS 배경 확장 및 확장 (0) | 2023.04.19 |