2016-10-16 2 views
2

컵 용 Docker 이미지를 만들려고하고 있는데, 수행하고 싶은 단계 중 하나는 "Listen"지시어를 주석 처리하는 것입니다.Dockerfile에서 sed 인라인 대체가 작동하지 않습니다.

Step 8 : RUN sed "s/^Listen /#Listen /" /etc/cups/cupsd.conf | grep Listen 
---> Running in 6b9dfeeaec7a 
#Listen localhost:631 
#Listen /var/run/cups/cups.sock 
---> 1737a534589d 
Step 9 : RUN sed -i "s/^Listen /#Listen /" /etc/cups/cupsd.conf 
---> Running in aacd768eb94c 
---> dbe12c2073ef 
Step 10 : RUN grep "Listen" /etc/cups/cupsd.conf 
---> Running in 650b27ecf7c4 
Listen localhost:631 
Listen /var/run/cups/cups.sock 
---> bf03b9f5de35 
Successfully built bf03b9f5de35 

왜 완벽 grep 작업에 파이프됩니다 sed에 대한 첫 번째 호출하지만, -i 플래그 두 번째는 변경하지 않습니다 샘플 빌드에서이 출력은 문제를 보여줍니다?

컨테이너를 대화 형으로 실행하고 (docker run -it cups sh) 명령을 복사하여 붙여 넣으면 (sed -i "s/^Listen /#Listen /" /etc/cups/cupsd.conf) 예상대로 변경됩니다.

FROM ubuntu:16.04 

RUN apt-get --quiet update && apt-get --quiet --assume-yes --allow-downgrades --allow-remove-essential --allow-change-held-packages dist-upgrade 

# Install cups 
RUN apt-get install --quiet --assume-yes --allow-downgrades --allow-remove-essential --allow-change-held-packages cups 

VOLUME /etc/cups/ 

EXPOSE 631 

RUN apt-get install --quiet --assume-yes --allow-downgrades --allow-remove-essential --allow-change-held-packages less vim 

RUN sed -i "s/^Listen /#Listen /" /etc/cups/cupsd.conf 

빌드 명령은 다음과 같습니다 : docker build --tag cups:test .

실행 명령은 다음과 같습니다

여기에 전체 Dockerfile의 docker run -it cups:test bash

docker info 출력 :

Containers: 9 
Running: 6 
Paused: 0 
Stopped: 3 
Images: 61 
Server Version: 1.12.1 
Storage Driver: aufs 
Root Dir: /mnt/storage/var/lib/docker/aufs 
Backing Filesystem: extfs 
Dirs: 65 
Dirperm1 Supported: true 
Logging Driver: json-file 
Cgroup Driver: cgroupfs 
Plugins: 
Volume: local 
Network: host bridge null overlay 
Swarm: inactive 
Runtimes: runc 
Default Runtime: runc 
Security Options: apparmor 
Kernel Version: 4.4.0-31-generic 
Operating System: Ubuntu 16.04.1 LTS 
OSType: linux 
Architecture: x86_64 
CPUs: 4 
Total Memory: 3.555 GiB 
Name: servy 
ID: LJZV:A2VY:BZPY:HHQX:DWSP:IAMK:XI43:Q7BA:YKVU:ONQX:VBHJ:GXRT 
Docker Root Dir: /mnt/storage/var/lib/docker 
Debug Mode (client): false 
Debug Mode (server): false 
Registry: https://index.docker.io/v1/ 
WARNING: No swap limit support 
Insecure Registries: 
127.0.0.0/8 

출력을에서 118,443,210 :

Docker version 1.12.1, build 23cf638 

감사

+0

Dockerfile 전체를 게시하십시오. 문제를 재현하려고했지만 인라인 대체 작업이 필요합니다. –

+0

또한,'docker info'의 출력이 도움이 될 것입니다. –

+0

둘러보기 주셔서 감사합니다! 나는'docker info'와 나를 위해 문제를 재현하는 완전한 Dockerfile을 추가했습니다. 나는 실제로 이미지를 도매로 복사 한 빌드 디렉토리에 전체 설정 파일을 두어 실제로이 작업을 실행했지만,'sed '를 사용하는 빌드가 작동하지 않는 이유는 여전히 궁금합니다. 너무 광범위하지 않은 한, 설정 파일에 대한 특정 편집 내용을 패키지 관리자의 버전의 구성 파일에 정확히 변경 한 내용을 더 잘 문서화 한 것입니다. 나는 또한 그것에 대한 의견을 사용할 수있을 것 같아요. – Dave

답변

4

문제는에 있습니다, 그 선 후

VOLUME /etc/cups/ 

의/etc/컵 (최종 용기에 볼 수없는 수있는 몇 가지 하나의 파일에 대한 변경 복사 명령이 적용되므로 완벽하지는 않습니다).

볼륨 줄 끝까지 이동하거나 바람직하게는 이미지에서 완전히 제거하십시오. 이 항목은 나중에이 폴더의 변경 사항으로 이미지를 확장하는 기능을 차단합니다. 그리고 언제든지 docker run -v ...으로 자신의 볼륨을 만들 수 있습니다 (또는 docker-compose.yml에서). 이미지에 볼륨을 만들면 이미지를 실행 한 후 익명의 볼륨이 docker volume ls에 나열됩니다.

+0

그래, 그게 다야. 내 사고는 "내가 끝내기 위해 노력하고있는 물건을 넣어 실험 할 때 가장 많은 단계를 캐싱했습니다." 빌드하는 동안 아무리 많은 양의 아이디어가 없었 더라면, run -v 스위치가 좀 더 다재다능한 점에 대해 좋은 지적을했다. 감사! – Dave

+0

@BMitch 이유가 무엇인가요? – stantonk

+0

Dockerfile에 정의 된 볼륨이 이와 같은 것을 나눕니다. 사용하지 마십시오. docker-compose.yml과 같이 런타임에 볼륨을 정의하십시오. – BMitch

관련 문제