Disable cache for specific RUN commands

前端 未结 7 521
暗喜
暗喜 2020-11-30 05:16

I have a few RUN commands in my Dockerfile that I would like to run with -no-cache each time I build a Docker image.

I understand the

相关标签:
7条回答
  • 2020-11-30 05:44

    Not directly but you can divide your Dockerfile in several parts, build an image, then FROM thisimage at the beginning of the next Dockerfile, and build the image with or without caching

    0 讨论(0)
  • 2020-11-30 05:49

    There's always an option to insert some meaningless and cheap-to-run command before the region you want to disable cache for.

    As proposed in this issue comment, one can add a build argument block (name can be arbitrary):

    ARG CACHEBUST=1 
    

    before such region, and modify its value each run by adding --build-arg CACHEBUST=$(date +%s) as a docker build argument (value can also be arbitrary, here it is current datetime, to ensure its uniqueness across runs).

    This will, of course, disable cache for all following blocks too, as hash sum of the intermediate image will be different, which makes truly selective cache disabling a non-trivial problem, taking into account how docker currently works.

    0 讨论(0)
  • 2020-11-30 05:53

    Use

    ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
    

    before the RUN line you want to always run. This works because ADD will always fetch the file/URL and the above URL generates random data on each request, Docker then compares the result to see if it can use the cache.

    I have also tested this and works nicely since it does not require any additional Docker command line arguments and also works from a Docker-compose.yaml file :)

    0 讨论(0)
  • 2020-11-30 05:53

    As of February 2016 it is not possible.

    The feature has been requested at GitHub

    0 讨论(0)
  • 2020-11-30 05:53

    I believe that this is a slight improvement on @steve's answer, above:

    RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git
    
    WORKDIR your_repository
    
    # Calls for a random number to break the cahing of the git clone
    # (https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
    ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
    RUN git pull
    

    This uses the Docker cache of the git clone, but then runs an uncached update of the repository.

    It appears to work, and it is faster - but many thanks to @steve for providing the underlying principles.

    0 讨论(0)
  • 2020-11-30 05:53

    Another quick hack is to write some random bytes before your command

    RUN head -c 5 /dev/random > random_bytes && <run your command>
    

    writes out 5 random bytes which will force a cache miss

    0 讨论(0)
提交回复
热议问题