How to configure different dockerfile for development and production

前端 未结 4 414
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-30 00:49

I use docker for development and in production for laravel project. I have slightly different dockerfile for development and production. For example I am mounting local director

相关标签:
4条回答
  • 2021-01-30 01:22

    I have tried several approaches to this, including using docker-compose, a multi-stage build, passing an argument through a file and the approaches used in other answers. My company needed a good way to do this and after trying these, here is my opinion.

    The best method is to pass the arg through the cmd. You can pass it through vscode while right clicking and choosing build image Image of visual studio code while clicking image build using this code:

    ARG BuildMode
    RUN echo $BuildMode
    RUN if [ "$BuildMode" = "debug" ] ; then apt-get update \
        && apt-get install -y --no-install-recommends \
           unzip \
        && rm -rf /var/lib/apt/lists/* \
        && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg ; fi
    

    and in the build section of dockerfile:

    ARG BuildMode
    ENV Environment=${BuildMode:-debug}
    RUN dotnet build "debugging.csproj" -c $Environment -o /app
    
    FROM build AS publish
    RUN dotnet publish "debugging.csproj" -c $Environment -o /app
    
    0 讨论(0)
  • 2021-01-30 01:29

    You can use build args directly without providing additional sh script. Might look a little messy, though. But it works.

    Dockerfile must be like this:

    FROM alpine
    ARG mode
    RUN if [ "x$mode" = "xdev" ] ; then echo "Development" ; else echo "Production" ; fi
    

    And commands to check are:

    docker build -t app --build-arg mode=dev .
    docker build -t app --build-arg mode=prod .
    
    0 讨论(0)
  • 2021-01-30 01:44

    As a best practice you should try to aim to use one Dockerfile to avoid unexpected errors between different environments. However, you may have a usecase where you cannot do that.

    The Dockerfile syntax is not rich enough to support such a scenario, however you can use shell scripts to achieve that.

    Create a shell script, called install.sh that does something like:

    if [ ${ENV} = "DEV" ]; then 
        composer install
    else
        npm install
    fi
    

    In your Dockerfile add this script and then execute it when building

    ...
    COPY install.sh install.sh
    RUN chmod u+x install.sh && ./install.sh
    ...
    

    When building pass a build arg to specify the environment, example:

    docker build --build-arg "ENV=PROD" ...
    
    0 讨论(0)
  • 2021-01-30 01:45

    UPDATE (2020): Since this was written 3 years ago, many things have changed (including my opinion about this topic). My suggested way of doing this, is using one dockerfile and using scripts. Please see @yamenk's answer.

    ORIGINAL:

    You can use two different Dockerfiles.

    # ./Dockerfile (non production)
    FROM foo/bar
    MAINTAINER ...
    
    # ....
    

    And a second one:

    # ./Dockerfile.production
    FROM foo/bar
    MAINTAINER ...
    
    RUN composer install
    

    While calling the build command, you can tell which file it should use:

    $> docker build -t mytag .
    $> docker build -t mytag-production -f Dockerfile.production .
    
    0 讨论(0)
提交回复
热议问题