programing

새 줄을 유지하면서 도커 파일에 여러 줄로 명령을 작성하는 방법은 무엇입니까?

muds 2023. 8. 19. 10:56
반응형

새 줄을 유지하면서 도커 파일에 여러 줄로 명령을 작성하는 방법은 무엇입니까?

도커 파일에 다음과 같은 RUN 명령어를 작성하고 싶습니다.그러나 도커는 새로운 라인을 보존하고 있지 않습니다.

RUN echo "[repo] \
name            = YUM Repository \
baseurl         = https://example.com/packages/ \
enabled         = 1 \
gpgcheck        = 0" > /etc/yum.repos.d/Repo.repoxyz

나는 그것을 알고 있습니다.\각 라인의 끝에서 새 라인을 이스케이프합니다.그런데 새로운 선을 보존하면서 여러 줄을 쓸 수 있는 방법이 있을까요?

"ANSI-C 견적"이라고 하는 것을 사용할 수 있습니다.$'...'원래는 aksh93 기능이었지만 현재는 bash, zsh, mksh, FreeB로 이용 가능합니다.SD sh와 busybox의 ash(ENABLE_로 컴파일된 경우에만 해당)ASH_BASH_COMPAT).

RUN은 기본적으로 셸로 사용하므로 먼저 SHELL 지침을 사용하여 bash와 같은 것으로 전환해야 합니다.

다음으로 명령 시작$'으로 끝내다.'및 사용\n\다음과 같은 새 줄의 경우:

SHELL ["/bin/bash", "-c"]

RUN echo $'[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0' > /etc/yum.repos.d/Repo.repoxyz

사용하다printf단일 실행 명령이 여러 줄의 텍스트를 출력하도록 허용하려면,\n새 줄을 삽입합니다.

실행 중:

RUN printf 'example\ntext\nhere' >> example.txt

추가:

example
text
here

철두철미하게example.txt

사용할 수 있는 항목:

RUN echo -e "\
[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0\
" > /etc/yum.repos.d/Repo.repoxyz

이렇게 하면 파일 내용을 빠르게 확인할 수 있습니다.당신은 모든 라인을 다음과 같이 끝내야 한다는 것을 알아야 합니다.\그리고 다음을 삽입합니다.\n필요할 때는

저는 새로운 라인 이후 위에 나열된 예제를 조합하여 사용하게 되었습니다.\n와 함께 작동하지 않았습니다.echo.

RUN printf 'example \n\
text \n\
here' >> example.txt

예상대로 다음을 생성합니다.

example
text
here

Docker 18.09Docker 파일 구문 1.4에서 Docker 파일은 기본적으로 여기서 원하는 문서를 지원합니다!

  1. BuildKit 사용(예: 설정)DOCKER_BUILDKIT=1.
  2. 도커 파일의 맨 위에 다음 행을 추가합니다.
    # syntax=docker/dockerfile:1.4
    
    또는 설명서의 권장 사항에 따라
    # syntax=docker/dockerfile:1
    
  3. 다음과 같이 hereoc를 다시 작성합니다.
    COPY <<EOF /etc/yum.repos.d/Repo.repoxyz
    [repo]
    name            = YUM Repository
    baseurl         = https://example.com/packages/
    enabled         = 1
    gpgcheck        = 0
    EOF
    

이 기능을 사용하여 단일에서 여러 bash 명령을 실행할 수도 있습니다.RUN블록 등자세한 정보:도커 블로그 게시물, 도커 파일 구문 문서.

도움이 될 수도 있습니다(https://github.com/jen-soft/pydocker ).

[ Dockerfile.py ]

from pydocker import DockerFile  # sudo pip install -U pydocker

d = DockerFile(base_img='debian:8.2', name='jen-soft/custom-debian:8.2')

d.RUN_bash_script('/opt/set_repo.sh', r'''
cat >/etc/apt/sources.list <<EOL
deb     http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main
EOL
apt-get clean && apt-get update
''')

d.EXPOSE = 80
d.WORKDIR = '/opt'
d.CMD = ["python", "--version"]

# d.generate_files()
d.build_img()

# sudo wget -qO- https://get.docker.com/ | sh

python Dockerfile.py
docker images

RUN을 여러 번 실행하여 파일을 완료할 수 있습니다.

RUN echo "[repo]" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "name            = YUM Repository" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "baseurl         = https://example.com/packages/" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "enabled         = 1" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "gpgcheck        = 0" >> /etc/yum.repos.d/Repo.repoxyz

이것은 모든 RUN 명령에 대해 새 도면층을 생성하기 때문에 최적의 솔루션이 아닐 수 있습니다.그러나 모든 계층은 변경한 만큼 크기가 커집니다. 이 경우에는 바이트 순서입니다(첫 번째 RUN 계층은 7바이트여야 함).

이 솔루션의 이점은 모든 셸에서 작동한다는 것입니다.

언급URL : https://stackoverflow.com/questions/33439230/how-to-write-commands-with-multiple-lines-in-dockerfile-while-preserving-the-new

반응형