새 줄을 유지하면서 도커 파일에 여러 줄로 명령을 작성하는 방법은 무엇입니까?
도커 파일에 다음과 같은 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.09 및 Docker 파일 구문 1.4에서 Docker 파일은 기본적으로 여기서 원하는 문서를 지원합니다!
- BuildKit 사용(예: 설정)
DOCKER_BUILDKIT=1
. - 도커 파일의 맨 위에 다음 행을 추가합니다.
또는 설명서의 권장 사항에 따라# syntax=docker/dockerfile:1.4
# syntax=docker/dockerfile:1
- 다음과 같이 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
'programing' 카테고리의 다른 글
테스트에 사용자 지정된 ObjectMapper가 사용되지 않음 (0) | 2023.08.19 |
---|---|
패싯 그리드의 xlim 및 ylim 설정 방법 (0) | 2023.08.19 |
SQL에서 특정 열과 날짜별로 고유한 행을 선택하는 방법은 무엇입니까? (0) | 2023.08.19 |
Oracle 트리거에 임의 매개 변수를 보내는 방법은 무엇입니까? (0) | 2023.08.19 |
Capistrano를 사용하여 다른 깃 분기에서 배치 (0) | 2023.08.19 |