빌드 중에 호스트 볼륨을 도커 파일의 도커 컨테이너에 마운트하는 방법
이 질문이 나온 2014년 이후로 많은 상황들이 일어났고 많은 것들이 바뀌었습니다. 오늘도 주제를 다시 살펴보고 있는데, 최근의 변화를 반영하기 위해 12번째로 이 문제를 수정합니다.질문이 길어 보이지만 역순으로 나열되어 있으므로 최신 변경 사항이 상위에 있으며 언제든지 자유롭게 읽기를 중단하십시오.
가 하고 은 을 에 에 에 가 하고 은 docker run -v /export:/export
중의 능력docker build
.
한 가지 이유는, 저는 도커에 물건을 지을 때, 그것들을 원하지 않기 때문입니다.apt-get install
) 단일 도커에 잠겨 있지만 공유/저장할 수 있는 캐시.
그것이 제가 이 질문을 하게 된 주된 이유였습니다.한 또 입니다. 할 때문입니다. 그렇지 않으면 제가 해야 하는 일입니다.git clone
도커에 있는 개인 레포에서 내 개인 ssh 키를 사용하고 있습니다. 나는 어떻게 그리고 아직 조사하지도 않았습니다.
최신 업데이트:
@BMitch의 답변에 등장하는 빌드킷
ㅇ
RUN --mount
syntax, build-mooth에서 마운트 읽기 전용 디렉토리를 바인딩할 수도 있습니다.
현재 도커에 내장되어 있습니다(제가 서드파티 도구라고 생각했는데). 당신의 것이 18.09 이상입니다.저는 지금 20.10.7 -- https://docs.docker.com/develop/develop-images/build_enhancements/
BuildKit 빌드를 활성화하려면 다음과 같이 하십시오.
도커를 새로 설치할 때 가장 쉬운 방법은 도커_B를 설정하는 것입니다.도커 빌드 명령을 호출할 때 UILDKIT=1 환경 변수:
$ DOCKER_BUILDKIT=1 docker build .
그렇지 않으면 다음을 얻을 수 있습니다.
the --mount option requires BuildKit. Refer to https://docs.docker.com/go/buildkit/ to learn how to build images with BuildKit enabled
위에서 설명한 대로 두 번째 사용 사례에 대한 완벽한 해결책이 될 것입니다.
2019년 5월 7일자 업데이트:
도커 v18.09 이전에 정답은 다음으로 시작하는 것이어야 합니다.
빌드 중에 볼륨을 마운트하는 방법이 있지만 도커 파일은 포함되지 않습니다.
그러나 그것은 형편없고 조직적이며 지지를 받는 답변이었습니다.도커 컨테이너를 다시 설치할 때 우연히 다음 기사를 보게 되었습니다.
apt-cacher-ng 서비스 도커라이징
https://docs.docker.com/engine/examples/apt-cacher-ng/
그것이 직접적이 아니라 간접적으로 이 질문에 대한 도커의 해결책입니다.그게 도커가 제안하는 정통적인 방법입니다.그리고 제가 여기서 물어보려던 것보다 낫다는 것을 인정합니다.
또 다른 방법은 v18.09의 빌드킷과 같이 새롭게 승인된 답변입니다.
당신에게 맞는 것을 고르시오.
도커에서 온 것이 아닌 로커가 해결책이 있었는데, 이제 로커가 단종되었기 때문에 저는 다시 "불가능"으로 답을 되돌립니다.
이전 업데이트:그래서 대답은 "가능하지 않다" 입니다.이 문제가 https://github.com/docker/docker/issues/3156 에서 광범위하게 논의된 것으로 알고 있기 때문에 답변으로 받아들일 수 있습니다.도커 개발자에게 휴대성이 가장 중요한 문제라는 것은 이해할 수 있지만, 도커 사용자로서 이 누락된 기능에 대해 매우 실망했다고 말해야 합니다.앞서 설명한 내용을 인용하면서 제 주장을 마무리하겠습니다. "Gentoo를 기본 이미지로 사용하고 싶지만 이미지가 구축되면 >1GB의 Portage 트리 데이터가 어떤 계층에도 포함되는 것을 절대 원하지 않습니다. 설치하는 동안 이미지에 거대한 포티지 트리가 나타나지 않았다면 멋진 소형 컨테이너를 가질 수 있었을 것입니다."예, wget 또는 curl을 사용하여 필요한 모든 것을 다운로드할 수 있습니다. 하지만 단지 휴대성을 고려하여 Gentoo 기본 이미지를 만들 때마다 > 1GB의 Portage tree를 다운로드해야 한다는 사실은 효율적이지도 않고 사용자 친화적이지도 않습니다.또한 패키지 저장소는 항상 /usr/portage 아래에 있으므로 Gentoo 아래에서 항상 휴대할 수 있습니다.다시 한번 그 결정을 존중하지만, 그 사이에 저의 실망감을 표현할 수 있게 해주세요.감사해요.
자세한 내용은 원래 질문:
부터
볼륨을 통해 디렉토리 공유
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volumes/
데이터 볼륨 기능은 "Docker Remote API 버전 1부터 사용할 수 있다"고 합니다.내 도커는 버전 1.2.0이지만 위 기사에 나와 있는 예제가 작동하지 않는 것을 발견했습니다.
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
도커 파일에서 볼륨 명령을 통해 호스트 마운트 볼륨을 도커 컨테이너에 마운트하는 적절한 방법은 무엇입니까?
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
할 는 할 수 .VOLUME
도커에게 장착할 것을 지시하는 지침.그렇게 되면 휴대성이 심각하게 깨지게 됩니다.이 지침은 도커에게 해당 디렉토리의 컨텐츠가 이미지로 이동하지 않으며 다른 컨테이너에서 액세스할 수 있음을 알려줍니다.--volumes-from
명령줄 매개 변수. Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ,-v /path/on/host:/path/in/container
호스트에서 디렉토리에 액세스할 수 있습니다.
빌드 중에는 호스트 볼륨을 마운트할 수 없습니다.권한 있는 빌드가 없으므로 호스트를 마운트하면 휴대성이 심각하게 저하됩니다.빌드에 필요한 모든 것을 다운로드하여 제자리에 배치하기 위해 wget 또는 curl을 사용해 볼 수 있습니다.
"왜 는 "는 는 는 는 는 는 는 는 는 는 는 라고 대답하는 것.VOLUME
때?"이라고 정의할 때VOLUME
Docker 파일에서는 볼륨의 원본이 아닌 대상만 정의할 수 있습니다.빌드 중에는 익명 볼륨만 생성됩니다.익명 볼륨은 다음 지점에 장착됩니다.RUN
령,의진음에다로다에음ted,의진령리로efdp,,ndde .RUN
∙. 변경이 됩니다.볼륨 변경이 아닌 컨테이너 변경만 저장됩니다.
이 질문이 제기된 이후 도움이 될 수 있는 몇 가지 기능이 출시되었습니다.첫 번째는 다단계 빌드를 통해 비효율적인 첫 번째 단계에서 디스크 공간을 구축하고 필요한 출력만 최종 단계로 복사할 수 있습니다.두 번째 기능은 빌드킷(Buildkit)으로 이미지가 구축되는 방식과 새로운 기능이 빌드에 추가되는 방식을 크게 바꾸고 있습니다.
빌드의 개의 로 의 의 은 의 은 FROM
각각의 라인이 개별 이미지 생성을 시작합니다.마지막 이미지만 기본적으로 태그가 지정되지만 이전 단계의 파일을 복사할 수 있습니다.표준 사용 방법은 이진 또는 다른 애플리케이션 아티팩트를 구축하기 위한 컴파일러 환경과 해당 아티팩트를 복사하는 두 번째 단계로 런타임 환경을 갖추는 것입니다.다음을 가질 수 있습니다.
FROM debian:sid as builder
COPY export /export
RUN compile command here >/result.bin
FROM debian:sid
COPY --from=builder /result.bin /result.bin
CMD ["/result.bin"]
그러면 전체 /내보내기 디렉토리가 아니라 결과 바이너리만 포함하는 빌드가 됩니다.
빌드킷은 18.09년에 실험에서 나옵니다.프론트엔드 파서를 변경할 수 있는 기능을 비롯하여 빌드 프로세스를 완전히 재설계한 것입니다. 중 한서경중는는중eetss한서경r을 구현했습니다.RUN --mount
들어 이미지를 가 빨라질 수 ).예를 들어, 데비안 디렉터리 중 일부를 마운트하는 디렉터리가 있습니다(데비안 이미지를 재구성하면 패키지 재설치 속도가 빨라질 수 있습니다).
# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/var/lib/apt/lists,type=cache \
--mount=target=/var/cache/apt,type=cache \
apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
git
maven의 경우 $HOME/.m2, golang의 경우 /root/.cache와 같은 애플리케이션 캐시에 대해 캐시 디렉토리를 조정합니다.
TL;DR: 답은 여기 있습니다.그걸로RUN --mount
구문을 사용하면 빌드-파일럿에서 마운트 읽기 전용 디렉터리를 바인딩할 수도 있습니다.폴더는 빌드 컨텍스트에 있어야 하며 호스트나 빌드 클라이언트에 다시 매핑되지 않습니다.
# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/export,type=bind,source=export \
process export directory here...
디렉토리는 컨텍스트에서 마운트되므로 읽기 전용으로 마운트되므로 변경사항을 호스트나 클라이언트에 푸시할 수 없습니다. 이상 할 18.09의고를과이을다할때할d할thn이때8할의ed,unu'ldtl과8rrexport DOCKER_BUILDKIT=1
.
mount flag가 지원되지 않는다는 오류가 발생하면 위 변수로 buildkit을 활성화하지 않았거나 주석을 포함한 다른 줄보다 먼저 Docker 파일 맨 위에 구문 줄이 있는 실험 구문을 활성화하지 않았음을 나타냅니다.빌드킷을 전환하는 변수는 도커 설치에 클라이언트와 서버 모두에서 도커의 버전 18.09 이상이 필요한 빌드킷 지원이 내장되어 있는 경우에만 작동합니다.
업데이트: 누군가는 '아니오'를 답으로 받아들이지 않을 것이고, 저는 특히 이 특정 질문에 매우 마음에 듭니다.
좋은 소식, 이제 방법이 있습니다.
해결책은 로커(Rocker: https://github.com/grammarly/rocker )입니다.
존 야니는 "IMO, 도커파일의 모든 약점을 해결하여 개발에 적합합니다."라고 말했습니다.
로커
https://github.com/grammarly/rocker
Rocker는 새로운 명령어를 도입함으로써 일반 도커의 문제점인 다음과 같은 사용 사례를 해결하고자 합니다.
- 빌드 단계에서 재사용 가능한 볼륨을 마운트하므로 종속성 관리 도구는 빌드 간에 캐시를 사용할 수 있습니다.
- ssh 키를 빌드(프라이빗 레포를 꺼내기 위한 등)와 공유하면서 결과 이미지에 남겨두지 않습니다.
- 다양한 이미지에서 응용프로그램을 빌드하고 실행하면 한 이미지에서 다른 이미지로 아티팩트를 쉽게 전달할 수 있습니다. 이상적으로 단일 도커 파일에 이러한 논리가 있습니다.
- 도커 파일에서 바로 이미지를 태그/푸시합니다.
- 셸 빌드 명령에서 변수를 전달하여 도커 파일로 대체할 수 있도록 합니다.
그리고 또.이것들이 우리가 Grammarly에서 Docker를 채택하는 것을 가로막고 있던 가장 중요한 문제들입니다.
업데이트: Github의 공식 프로젝트 레포에 따라 로커가 중단되었습니다.
2018년 초 현재 컨테이너 생태계는 이 프로젝트가 시작된 3년 전보다 훨씬 성숙해졌습니다.이제 로커의 중요한 기능과 뛰어난 기능 중 일부는 도커 빌드 또는 기타 잘 지원되는 도구로 쉽게 다룰 수 있지만, 일부 기능은 로커 고유의 기능으로 남아 있습니다.자세한 내용은 https://github.com/grammarly/rocker/issues/199 을 참조하십시오.
빌드 중에 볼륨을 마운트하는 방법이 있지만 도커 파일은 포함되지 않습니다.
이 기법은 사용하고자 하는 모든 베이스(볼륨을 컨테이너에 마운트)에서 컨테이너를 생성하는 것입니다.-v
옵션), 셸 스크립트를 실행하여 이미지 작성 작업을 수행한 다음 완료되면 컨테이너를 이미지로 커밋합니다.
이를 통해 원하지 않는 과잉 파일을 제거할 수 있을 뿐만 아니라(SSH 파일과 같은 보안 파일에도 좋습니다) 단일 이미지를 생성합니다.commit 명령어가 모든 도커 파일 명령을 지원하는 것은 아니며 빌드 스크립트를 편집해야 할 경우 종료할 때 선택할 수 없다는 단점이 있습니다.
업데이트:
예를들면,
CONTAINER_ID=$(docker run -dit ubuntu:16.04)
docker cp build.sh $CONTAINER_ID:/build.sh
docker exec -t $CONTAINER_ID /bin/sh -c '/bin/sh /build.sh'
docker commit $CONTAINER_ID $REPO:$TAG
docker stop $CONTAINER_ID
컨테이너를 실행하면 호스트의 디렉토리가 생성되고 컨테이너에 마운트됩니다.이것이 어떤 디렉토리인지 알 수 있습니다.
$ docker inspect --format "{{ .Volumes }}" <ID>
map[/export:/var/lib/docker/vfs/dir/<VOLUME ID...>]
, 의 에 를 에 의 를 -v
parameter를 합니다.고객님의 경우 다음과 같습니다.
docker run -v /export:/export data
따라서 컨테이너 내부의 hosts 폴더를 사용하게 됩니다.
못생겼지만, 저는 이와 같은 모습을 얻었습니다.
도커 파일:
FROM foo
COPY ./m2/ /root/.m2
RUN stuff
imageBuild.sh:
docker build . -t barImage
container="$(docker run -d barImage)"
rm -rf ./m2
docker cp "$container:/root/.m2" ./m2
docker rm -f "$container"
저는 우주를 /root/.m2로 다운로드하는 자바 빌드를 가지고 있고, 매번 그렇게 했습니다.imageBuild.sh
후 하고,드후의을다에당다에을se의후드d당eor .Dockerfile
다음 빌드를 위해 이미지로 다시 복사합니다.
이것은 볼륨이 작동하는 방식과 유사합니다(즉, 빌드 간에 지속됨).
많은 사람들이 이미 답변했듯이 빌드 중에 호스트 볼륨을 마운트할 수 없습니다.나는 단지 추가하고 싶습니다.docker-compose
제 생각에는, 대부분 개발/테스트용으로 사용하는 것이 좋을 것 같습니다.
도커파일
FROM node:10
WORKDIR /app
COPY . .
RUN npm ci
CMD sleep 999999999
도커-디젤.yml
version: '3'
services:
test-service:
image: test/image
build:
context: .
dockerfile: Dockerfile
container_name: test
volumes:
- ./export:/app/export
- ./build:/app/build
그리고 까지 합니다.docker-compose up -d --build
도커 명령을 통해 빌드를 실행하면 원하는 작업을 수행할 수 있다고 생각합니다. 도커 명령은 도커 컨테이너 내부에서 실행됩니다.이제 Docker | Docker 블로그에서 Docker를 실행할 수 있습니다.가능한 가장 작은 도커 컨테이너를 만드는 방법을 탐색하는 동안 컨테이너를 사용하여 외부 도커에 실제로 액세스하는 이와 같은 기술이 사용되었습니다.
또 다른 관련 기사는 Optimizing Docker Images | CenturyLink Labs로, 빌드 중에 물건을 다운로드하게 되면 한 번의 실행 단계에서 다운로드, 빌드 및 삭제를 통해 최종 이미지에서 공간 낭비를 피할 수 있다고 설명합니다.
다음은 셸 스크립트 없이 빌드 및 커밋을 사용하는 2단계 접근 방식의 단순화된 버전입니다.관련 항목:
- 볼륨 없이 부분적으로 이미지 구축
- 볼륨이 있는 컨테이너를 실행하고 변경한 다음 결과를 커밋하여 원래 이미지 이름을 바꿉니다.
비교적 사소한 변경을 통해 추가적인 단계를 수행하면 빌드 시간이 몇 초밖에 되지 않습니다.
기본적으로:
docker build -t image-name . # your normal docker build
# Now run a command in a throwaway container that uses volumes and makes changes:
docker run -v /some:/volume --name temp-container image-name /some/post-configure/command
# Replace the original image with the result:
# (reverting CMD to whatever it was, otherwise it will be set to /some/post-configure/command)
docker commit --change="CMD bash" temp-container image-name
# Delete the temporary container:
docker rm temp-container
제 사용 사례에서는 maven toolchains.xml 파일을 미리 생성하고 싶지만, 많은 JDK 설치가 실행 시간까지 사용할 수 없는 볼륨에 있습니다.내 이미지 중 일부는 모든 JDK와 호환되지 않기 때문에 빌드 시 호환성을 테스트하고 조건부로 toolchains.xml을 채워야 합니다.이미지를 휴대용으로 사용할 필요는 없습니다. 도커 허브에 게시하지 않습니다.
과 " " " "을 "을 ""와 같은 파일을 "마운트"하는 방법을 찾고 있는 경우-v
위해서docker run
, 이제 당신은 사용할 수 있습니다.--secret
깃발을 꽂다docker build
echo 'WARMACHINEROX' > mysecret.txt
docker build --secret id=mysecret,src=mysecret.txt .
그리고 도커 파일 안에서 이 비밀에 접근할 수 있습니다.
# syntax = docker/dockerfile:1.0-experimental
FROM alpine
# shows secret from default secret location:
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret
# shows secret from custom secret location:
RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar
Docker 문서에서 사용 가능한 비밀에 대한 자세한 정보
내 개인 ssh 키를 사용하여 도커 내의 개인 저장소에서 git 클론.
이미지를 때하면, 를 하면 하면 를 docker build
또한 를 사용하여 SSH 에이전트 포워딩을 제공합니다.--ssh
플래그. 도커의 빌드에서 개인 데이터에 액세스하기 위해 SSH를 사용하는 것에 문서화되어 있듯이, 도커 파일은 다음을 사용할 수 있습니다.--mount=type=ssh
일순간에RUN
명령: SSH 인증을 호스트의 SSH 에이전트에 위임합니다.
# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache openssh-client git
# Download public key of remote server at github.com
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
# Enable verbose output (optional)
ENV GIT_SSH_COMMAND='ssh -Tvv'
# Clone using private keys known to SSH agent on the host
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject
빌드 시 위는 기본적으로 다음을 실행하는 것만으로 호스트의 SSH 키를 사용할 수 있습니다.
docker build --ssh default .
에서 은 을 하여 해야 해야 에서 하여 은 을 ssh-add
와 같이; 잘 있다면, 에 된 된 와 에서 하다면 이 하다면 이 echo $SSH_AGENT_SOCK
아니면echo $SSH_AUTH_SOCK
출력을 하고,게의줄고고을,고고edu줄의,게을d .ssh-add -L
위에서 사용할 수 있는 신원을 표시해야 합니다.
상세 로깅을 사용할 때 발생할 수 있는 몇 가지 오류:
Host key verification failed
의 : 를 의 에 하지 에 .~/.ssh/known_hosts
pubkey_prepare: ssh_get_authentication_socket: No such file or directory
: 당신은 그것을 포함하는 것을 잊었습니다.--ssh default
docker build
pubkey_prepare: ssh_get_authentication_socket: Permission denied
: 당신은 좀 사용하고 있습니까?USER <username>
? 그런 다음 을 사용하여 사용자 ID를 지정하거나 소켓을 모든 사용자에게 열어 줍니다.--mount=type=ssh,mode=0666
PIP/Conda/Mamba와도 연동되어 Python 의존성을 버전 제어에서 직접 설치할 수 있습니다.git+ssh://git@github.com/myorg/myproject.git@mybranch#egg=myproject
:
RUN --mount=type=ssh mamba env create -n myenv --file conda_environment.yml
Windows 컨테이너에 대해서는 BuildKit이 여전히 지원되지 않으므로 네트워크 공유를 사용하는 것이 한 가지 대안입니다.이렇게 하면 설치 프로그램이 한 번의 RUN 문을 실행하는 동안 컨테이너에서 추가/제거되기 때문에 최소한의 Docker 이미지 크기가 생성됩니다.
- 호스트 시스템의 폴더에 EXE/MSI 파일 배치
- 폴더 공유
- 도커 빌드 시작
- 도커 컨테이너 내에서 공유 매핑
- 각 설치 프로그램 복사 + 실행 + 삭제
- 컨테이너 내 매핑 제거
- 엔드 도커 빌드
- 호스트 시스템의 폴더 공유 해제
다음은 Java 11 Windows 컨테이너를 만드는 작업 예입니다.
build.cmd:
host=%COMPUTERNAME%
set domainAndUser=whoami
set "pswd=<host-password>"
set "shareName=tmpSmbShare"
set netPath=\\%COMPUTERNAME%\%shareName%
set "localPath=C:/Users/tester/Desktop/docker/Java11/winsrvcore/installers"
powershell New-SmbShare -Name %shareName% -Path %localPath% -FullAccess "Everyone"
docker build ^
--build-arg domainAndUser=%domainAndUser% ^
--build-arg pswd=%pswd% ^
--build-arg netPath=%netPath% ^
-t <docker-username>/java-11.0.16-winsrvcore.ltsc2019:1.0 .
powershell Remove-SmbShare -Name %shareName% -Force
도커 파일:
FROM mcr.microsoft.com/windows/servercore:ltsc2019-amd64
ARG domainAndUser
ARG pswd
ARG netPath
RUN powershell New-SMBMapping -LocalPath "R:" -RemotePath "$env:netPath" -UserName "$env:domainAndUser" -Password "$env:pswd" \
&& dir "R:/" \
&& copy "R:/jdk-11.0.16_windows-x64_bin.exe" "C:/" \
&& powershell Start-Process -filepath 'C:/jdk-11.0.16_windows-x64_bin.exe' -Wait -PassThru -ArgumentList "/s,/L,install64.log" \
&& powershell Remove-SMBMapping -LocalPath "R:" -Force \
&& del "C:/jdk-11.0.16_windows-x64_bin.exe"
ENV JAVA_HOME "C:\Program Files\Java\jdk-11.0.16"
TL;DR: 사용docker run
--volume
후, 를 한 docker commit
컨테이너 안에서.
저는 이념적으로 도커의 철학에 반대합니다.이 제한은 사용자가 소프트웨어로 원하는 작업을 수행할 수 있도록 허용하는 정책 결정의 결과입니다.가,은은를다지l를rhr은가s은t지,,lr--mount=type=cache
치 않게 느린 을 통해 하는 데 을 더 소비해야
(선택사항) /var/cache/apt/archives 오버레이를 만듭니다.
나는 차라리 내 시스템의 적절한 캐시를 사용하고 싶지만, 컨테이너가 수정하는 것을 수정하는 것은 원하지 않습니다.그래서 제 해결책은 쓰기 위한 컨테이너의 오버레이를 설정하는 것입니다. (이 단계를 자유롭게 건너뛰고 어딘가에 빈 디렉토리로 대체하십시오.)
d=/var/cache/apt-overlay
mkdir -p $d/{upper,work,merged}
mount -t overlay -o lowerdir=/var/cache/apt/archives,upperdir=$d/upper,workdir=$d/work apt-archives $d/merge
더 솔루션
사용하다docker run
t 산을 /var/cache/apt/archives
, , , , , , , , , , , , , , , , , , ./usr/bin/docker
및 CLI,/var/run/docker.sock
할 수 . 하고 할 를 할 하고 를 .docker commit
당신이 끝나면 컨테이너 안에서.
#!/bin/bash
img_src="debian:stable-slim"
img_dst="myimg"
set -ex
if ! docker_gid=$(grep "^docker:" /etc/group | awk -F: '{print $3}'); then
echo "Can't get docker group id" >&1
exit 1
fi
DOCKER_BUILDKIT=1 \
BUILDKIT_PROGRESS=plain \
docker run --rm -i \
--volume /var/cache/apt-overlay/merged:/var/cache/apt/archives \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume /usr/bin/docker:/usr/bin/docker:ro \
$img_src << EOF
set -ex
groupadd --gid ${docker_gid} docker
mv /etc/apt/apt.conf.d/docker-clean /root; \
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
> /etc/apt/apt.conf.d/10apt-keep-downloads
export DEBIAN_FRONTEND=noninteractive
apt update
apt -y install apt-utils
apt -y upgrade
# This probably isn't really needed, but just in case...
sync
docker commit \$HOSTNAME $img_dst
EOF
정리하다
이미지를 에서 의 에서 으로 을 해야 를 해야 을 으로 를 에서 /etc/apt.conf.d
, 그러나 언제/var/cache/apt/archives
마운트되지 않았습니다.
docker build --tag <dst_img> - << EOF
FROM <src_img>
RUN \
set -ex; \
mv /root/docker-clean /etc/apt/apt.conf.d/; \
rm /etc/apt/apt.conf.d/10apt-keep-downloads; \
DEBIAN_FRONTEND=noninteractive apt clean
EOF
Linux에서 데이터 저장용 컨테이너 내부에 USB 드라이브를 장착하려면 다음 작업을 수행합니다.
supdisk -l
sudo mkdir/mnt/usb
sudo mount /dev/sda2 /mnt/usb 이 작업을 수행하기 전에 OS 파일 시스템에서 드라이브를 마운트 해제해야 합니다. 그러면 시스템에서 /dev/id가 달라집니다.
ls/mnt/usb
cd/mnt/usbs
sudo mount/mnt/usb
sudo mount /dev/sda2/mnt/usb
도커 실행 -i -t -v /mnt/usb:/opt/usb bin/bash USB 드라이브를 /mint/usb의 컨테이너에 넣습니다.
언급URL : https://stackoverflow.com/questions/26050899/how-to-mount-host-volumes-into-docker-containers-in-dockerfile-during-build
'programing' 카테고리의 다른 글
JSF 동적에는 Ajax 요청 사용이 포함됩니다. (0) | 2023.09.07 |
---|---|
Safari ajax request Failed to load resource: The network connection was lost (0) | 2023.09.07 |
Error dialog displayed when opening an excel file generated with EPPlus (0) | 2023.09.07 |
Chrome의 대용량 JSON 데이터 검사 (0) | 2023.09.07 |
Git에서 병합 커밋의 부모를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.07 |