使用 Dockerfile 代替命令 docker exec

Using Dockerfile instead of the command docker exec

我在 GitLab CI 中有以下设置。我有一个脚本,用于使用 php、composer 和 npm 命令构建我的应用程序。

我想用单个 Dockerfile 替换脚本。

这是脚本:

#!/bin/bash

if [ "$APP" = "webapp" ]; then
  docker exec -t cozact_app composer install && \
  docker exec -t cozact_app php artisan down && \
  docker exec -t cozact_app php artisan migrate --force && \
  docker exec -t cozact_app php artisan storage:link && \
  docker exec -t cozact_app php artisan droit:run && \
  docker exec -t cozact_app npm install;
fi

if [ "$APP" = "webapp" ] && [ "$ENV" = "test" ]; then
  docker exec -t cozact_app npm run dev && \
  docker exec -t cozact_app php artisan up;
fi

if [ "$APP" = "webapp" ] && [ "$ENV" = "preprod" ]; then
  docker exec -t cozact_app npm run production && \
  docker exec -t cozact_app php artisan up;
fi

if [ "$APP" = "webapp" ] && [ "$ENV" = "prod" ]; then
  docker exec -t cozact_app npm run production && \
  docker exec -t cozact_app php artisan up;
fi
#!/bin/sh

composer install && \
php artisan down && \
php artisan migrate --force && \
php artisan storage:link && \
php artisan droit:run && \
npm install

if [ "$var" = "test" ] ; then
  npm run dev && \
  php artisan up;
else
  npm run production && \
  php artisan up;
fi

您可以使用以下 Multi-stage Dockerfile,并根据您的用例进行调整。

ARG APP_ENVIRONMENT=dev

FROM composer:latest as vendor


COPY database/ database/
COPY composer.json composer.json
COPY composer.lock composer.lock

RUN composer install && \
  php artisan down && \
  php artisan migrate --force && \
  php artisan storage:link && \
  php artisan droit:run && \


FROM node:latest as frontend

RUN mkdir -p /app/public

COPY package.json webpack.mix.js package.lock /app/
COPY resources/assets/ /app/resources/assets/

WORKDIR /app

RUN npm install && \
   npm run $APP_ENVIRONMENT

FROM php:7.2-apache-stretch
COPY . /var/www/html
COPY --from=vendor /app/vendor/ /var/www/html/vendor/
COPY --from=frontend /app/public/js/ /var/www/html/public/js/
COPY --from=frontend /app/public/css/ /var/www/html/public/css/
COPY --from=frontend /app/mix-manifest.json /var/www/html/mix-manifest.json

这个 Dockerfile 由 3 个阶段组成:

  1. 供应商:它获取作曲家包和 运行 php artisan 命令(我不是 laravel 专家。所以确保只保留 php artisan 在构建期间应该 运行 而不是在 运行 期间的命令。php artisan 在 运行 期间需要 运行 的命令应该放在 CMD 或最后阶段的 ENTRYPOINT)
  2. 前端:它获取 JavaScript 个文件,下载包并构建静态文件
  3. 运行阶段的最后一个阶段,它复制图像中的代码并从早期阶段获取前端和供应商文件。

the Dockerfile accepts a build argument APP_ENVIRONMENT that you can pass in CLI to control which env you are building to.
And then in gitlab-ci.yml you can just run a

docker build --build-arg APP_ENVIRONMENT=production .

在你 gitlab-ci.yml 中,你将拥有如下内容:

job:
  variables:
    DEPLOY_VARIABLE: "default-deploy"
  rules:
    - if: $CI_COMMIT_REF_NAME == "dev"
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
      variables:                              # Override DEPLOY_VARIABLE defined
        API_ENVIRONMENT: "production"  # at the job level.
  script:
    - docker build -t --build-arg API_ENVIRONMENT=${API_ENVIRONMENT} "some-tag" .

Here is the issue composer install shows within gitlab-ci

此问题与 composer.json 文件中提到的部分有关,我确实对其进行了评论以使其对我有用,但我不知道是否还会有其他问题,因为这个省略

   "post-autoload-dump": [
        "Illuminate\Foundation\ComposerScripts::postAutoloadDump",
        "@php artisan package:discover --ansi"
    ],