programing

빌드 중에 호스트 볼륨을 도커 파일의 도커 컨테이너에 마운트하는 방법

css3 2023. 9. 7. 21:57

빌드 중에 호스트 볼륨을 도커 파일의 도커 컨테이너에 마운트하는 방법

이 질문이 나온 2014년 이후로 많은 상황들이 일어났고 많은 것들이 바뀌었습니다. 오늘도 주제를 다시 살펴보고 있는데, 최근의 변화를 반영하기 위해 12번째로 이 문제를 수정합니다.질문이 길어 보이지만 역순으로 나열되어 있으므로 최신 변경 사항이 상위에 있으며 언제든지 자유롭게 읽기를 중단하십시오.

가 하고 은 을 에 에 에 가 하고 은 docker run -v /export:/export중의 능력docker build.

한 가지 이유는, 저는 도커에 물건을 지을 때, 그것들을 원하지 않기 때문입니다.apt-get install) 단일 도커에 잠겨 있지만 공유/저장할 수 있는 캐시.

그것이 제가 이 질문을 하게 된 주된 이유였습니다.한 또 입니다. 할 때문입니다. 그렇지 않으면 제가 해야 하는 일입니다.git clone도커에 있는 개인 레포에서 내 개인 ssh 키를 사용하고 있습니다. 나는 어떻게 그리고 아직 조사하지도 않았습니다.

최신 업데이트:

@BMitch의 답변에 등장하는 빌드킷

RUN --mountsyntax, 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때?"이라고 정의할 때VOLUMEDocker 파일에서는 볼륨의 원본이 아닌 대상만 정의할 수 있습니다.빌드 중에는 익명 볼륨만 생성됩니다.익명 볼륨은 다음 지점에 장착됩니다.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는 새로운 명령어를 도입함으로써 일반 도커의 문제점인 다음과 같은 사용 사례를 해결하고자 합니다.

  1. 빌드 단계에서 재사용 가능한 볼륨을 마운트하므로 종속성 관리 도구는 빌드 간에 캐시를 사용할 수 있습니다.
  2. ssh 키를 빌드(프라이빗 레포를 꺼내기 위한 등)와 공유하면서 결과 이미지에 남겨두지 않습니다.
  3. 다양한 이미지에서 응용프로그램을 빌드하고 실행하면 한 이미지에서 다른 이미지로 아티팩트를 쉽게 전달할 수 있습니다. 이상적으로 단일 도커 파일에 이러한 논리가 있습니다.
  4. 도커 파일에서 바로 이미지를 태그/푸시합니다.
  5. 셸 빌드 명령에서 변수를 전달하여 도커 파일로 대체할 수 있도록 합니다.

그리고 또.이것들이 우리가 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...>]

, 의 에 를 에 의 를 -vparameter를 합니다.고객님의 경우 다음과 같습니다.

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단계 접근 방식의 단순화된 버전입니다.관련 항목:

  1. 볼륨 없이 부분적으로 이미지 구축
  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 runt 산을 /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