使用 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 个阶段组成:
- 供应商:它获取作曲家包和 运行 php artisan 命令(我不是 laravel 专家。所以确保只保留
php artisan
在构建期间应该 运行 而不是在 运行 期间的命令。php artisan
在 运行 期间需要 运行 的命令应该放在 CMD
或最后阶段的 ENTRYPOINT
)
- 前端:它获取 JavaScript 个文件,下载包并构建静态文件
- 运行阶段的最后一个阶段,它复制图像中的代码并从早期阶段获取前端和供应商文件。
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"
],
我在 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 个阶段组成:
- 供应商:它获取作曲家包和 运行 php artisan 命令(我不是 laravel 专家。所以确保只保留
php artisan
在构建期间应该 运行 而不是在 运行 期间的命令。php artisan
在 运行 期间需要 运行 的命令应该放在CMD
或最后阶段的ENTRYPOINT
) - 前端:它获取 JavaScript 个文件,下载包并构建静态文件
- 运行阶段的最后一个阶段,它复制图像中的代码并从早期阶段获取前端和供应商文件。
the Dockerfile accepts a build argument
APP_ENVIRONMENT
that you can pass in CLI to control which env you are building to.
And then ingitlab-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"
],