How to copy files from dockerfile to host?

前端 未结 5 2053
难免孤独
难免孤独 2021-01-03 22:12

I want to get some files when dockerfile built successfully, but it doesn\'t copy files from container to host.

That means when I have built dockerfile, the files

相关标签:
5条回答
  • 2021-01-03 22:20

    Copying files "from the Dockerfile" to the host is not supported. The Dockerfile is just a recipe specifying how to build an image.

    When you build, you have the opportunity to copy files from host to the image you are building (with the COPY directive or ADD)

    You can also copy files from a container (an image that has been docker run'd) to the host with docker cp (atually, the cp can copy from the host to the container as well)

    If you want to get back to your host some files that might have been generated during the build (like for example calling a script that generates ssl), you can run a container, mounting a folder from your host and executing cp commands.

    See for example this getcrt script.

    docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/apache:/apache apache << COMMANDS
    pwd
    cp crt /apache
    cp key /apache
    echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
    chown -R $(id -u):$(id -u) /apache/crt
    chown -R $(id -u):$(id -u) /apache/key
    COMMANDS
    

    Everything between COMMANDS are commands executed on the container, including cp ones which are copying on the host ${HOME}/b2d/apache folder, mounted within the container as /apache with -v ${HOME}/b2d/apache:/apache.

    That means each time you copy anything on /apache in the container, you are actually copying in ${HOME}/b2d/apache on the host!

    0 讨论(0)
  • 2021-01-03 22:21

    This is now possible since Docker 19.03.0 in July 2019 introduced "custom build outputs". See the official docs about custom build outputs.

    To enable the possibility to output the results out from the build image into the host during the build process, you need to activate the BuildKit which is a newer recommended back-compatible way for the engine to do the build phase. See the official docs for enabling BuildKit.

    This can be done in 2 ways:

    1. Set the environment variable DOCKER_BUILDKIT=1
    2. Set it in the docker engine by default by adding "features": { "buildkit": true } to the root of the config json.

    From the official docs about custom build outputs:

    custom exporters allow you to export the build artifacts as files on the local filesystem instead of a Docker image, which can be useful for generating local binaries, code generation etc.

    ...

    The local exporter writes the resulting build files to a directory on the client side. The tar exporter is similar but writes the files as a single tarball (.tar).

    If no type is specified, the value defaults to the output directory of the local exporter.

    ...

    A common pattern for exporting only specific files is to do multi-stage builds and to copy the desired files to a new scratch stage with COPY --from.

    e.g. an example Dockerfile

    FROM alpine:latest AS stage1
    WORKDIR /app
    RUN echo "hello world" > output.txt
    
    FROM scratch AS export-stage
    COPY --from=stage1 /app/output.txt .
    

    Running

    DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
    

    The tail of the output is:

     => [export-stage 1/1] COPY --from=stage1 /app/output.txt .
    0.0s
     => exporting to client
    0.1s
     => => copying files 45B
    0.1s
    

    This produces a local file out/output.txt that was created by the RUN command.

    $ cat out/output.txt
    hello world
    
    0 讨论(0)
  • 2021-01-03 22:27

    Although it's not directly supported via the Dockerfile functionality, you can copy files from a built docker image.

    containerId=$(docker create example:latest)
    docker cp "$containerId":/source/path /destination/path
    docker rm "$containerId"
    
    0 讨论(0)
  • 2021-01-03 22:28

    Perhaps you could mount a folder from the host as a volume and put the files there? Usually mounted volumes could be written to from within the container, unless you specify read-only option while mounting.

    docker run -v ${PWD}:/<somewritablepath> -w <somewritablepath> <image> <action>
    
    0 讨论(0)
  • 2021-01-03 22:40

    On completion of Docker Build using Dockerfile, following worked for me :

    where /var/lib/docker/ is Docker Root Dir: at my setup.

    sudo find /var/lib/docker/ -name DESIRED_FILE -type f | xargs sudo ls -hrt | tail -1 | grep tgz | xargs  -i  sudo cp -v  '{}' PATH_ON_HOST
    
    0 讨论(0)
提交回复
热议问题