将在Docker上构建的项目部署到ECS直至完成【项目的Docker化】
- 使用CodePipeline进行自动部署将PJ的docker化,并在ECS上运行映像。
本地将项目进行Docker化。
环境为
-
- nginx
-
- cakephp3
- php-fpm
安装Docker
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81
こちらの記事を参考にインストールしました。
チュートリアルを一通りやれば最低限のDocker環境が整います。
ソースコードをclone
$ git clone {リポジトリURL}
将来我将在此项目路线上进行工作。
Dockerビルドに使用するファイルの作成
需要的是以下: shì
-
- docker-compose.yml:ローカルでの起動設定を定義
- Dockerfile:ローカルのソースコードをコンテナにあげる処理を書きます。コンテナ毎に必要
创建docker-compose.yml文件
詳しい書き方は上記の方が非常にわかりやすかったのでおすすめ
今回はnginxとphp-fpmとmemcacheでそれぞれコンテナを作成しました。
個人的なポイントはsrc以下をマウントしたこと。
volumes:
- {ローカルディレクトリ}:{コンテナ上のディレクトリ}
使用此方法可以将本地目录与容器中的目录进行同步。
稍后我们会使用docker-compose build命令将源代码上传到容器中,如果没有这个命令,每次更改都需要重新构建。
创建Dockerfile
每个容器都将创建。
目录结构看起来是这样的↓
PJルート - docker - nginx -- Dockerfile
| |
| -- その他のconfファイル
- php-fpm - Dockerfile
|
- その他のconfファイル
在这个文件中,我们将执行向容器下载库文件,复制源代码等操作。以nginx的Dockerfile为例,具体命令请参考参考文献。
# docker/nginx/Dockerfile
FROM openresty/openresty:1.19.3.1-1-alpine
RUN apk --update add tzdata gettext && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
apk del tzdata
ADD ./docker/nginx/nginx.conf /etc/nginx/nginx.conf
RUN mkdir -p /app
WORKDIR /app
RUN mkdir -p /webroot
ADD ./webroot/ /app/webroot
经常使用的命令如下:
FROM:基于哪个镜像(请填写Docker Hub的仓库名)
RUN:在容器上执行后续编写的命令
ADD:将本地文件/目录复制到容器中
WORKDIR:切换容器上的当前目录
我之前没在上述的nginx代码中添加源代码(src),这与nginx的运行无关。
(php-fpm的代码已经添加了。)
每个容器只添加了“该库所需的必要组件”。
创建composer.json文件
请问如何在cake中安装,虽然不是docker文件。
您可以创建composer.json↓,在Docker文件中添加RUN composer install。
"require": {
"php": ">=5.6",
"cakephp/cakephp": "3.6.*",
"cakephp/migrations": "^2.0.0",
"cakephp/plugin-installer": "^1.0",
"electrolinux/phpquery": "^0.9.6",
"intervention/image": "^2.5",
"josegonzalez/dotenv": "3.*",
"league/csv": "^9.6",
"mobiledetect/mobiledetectlib": "2.*",
"aws/aws-sdk-php": "3.*"
},
确认行动
暂且这样写应该可以了。
首次需要进行构建。
在PJ根目录下。
docker-compose build
执行后开始构建。
结束后,
docker-compose up
在容器中运行。
应该能够通过 http://localhost:{docker-compose.yml中指定的端口号} 访问。
创建.env文件
今回の構成の場合、git管理されているファイルはローカルも検証環境も本番環境も全て同じコードになります。
なので環境に依存する変数は.envファイルに書き、コードで使う際にはそこから読み出すように変更します。
#mode
IS_DEBUG=true
如果这样写,那么该环境变量的”IS_DEBUG”键将包含字符串”true”。
然后根据不同的语言规范来调用它。
在PHP的情况下,可以使用getenv(‘IS_DEBUG’)。
https://www.php.net/manual/ja/function.getenv.php
這樣寫的話,該環境變數的”IS_DEBUG”鍵將包含串”true”。
然後根據不同語言的規範來呼叫它。
在PHP的情況下,可以使用getenv(‘IS_DEBUG’)。
https://www.php.net/manual/ja/function.getenv.php
小咖啡馆
想要登录本地容器时
在容器启动中,位于项目根目录中。
docker-compose exec {コンテナ名} /bin/sh
可以用登录。
当容器上的存储空间不足时
在进行ADD等操作时
failed to copy files: copy file range failed: no space left on device
有时候会被怒骂,出现这种错误是因为存储空间耗尽,与消息所述一致。
Docker构建时的缓存和镜像会保留,如果不处理,会占用存储空间,并出现此类错误。
因此,只需将它们删除即可。
仅提供一个选项,以下是对原文进行中文本地化的改写:
参考一下
在任意的目录中
docker system df
在我现在的环境中敲击它,可以知道其中哪一个被填充了。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 64 5 50.92GB 50.32GB (98%)
Containers 5 0 2.449kB 2.449kB (100%)
Local Volumes 1 1 10.32MB 0B (0%)
Build Cache 475 0 6.618GB 6.618GB
只要删除图像和缓存就可以解决这个问题。
删除图像(不删除正在使用的图像)
docker rmi $(docker images -q)
清除缓存
docker builder prune
所以,最后的结果是
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 8 4 2.833GB 2.262GB (79%)
Containers 4 0 1.356kB 1.356kB (100%)
Local Volumes 1 1 10.32MB 0B (0%)
Build Cache 68 0 0B 0B
总结
如果按照上述步骤逐一修正错误,应该能够使其暂时正常运行。
需要注意的是,
-
- 元々あったライブラリをもれなくインストールする
Dockerfileで明示的に書かないと入らないので結構忘れる
環境依存変数の入れ忘れに注意
大概是多久呢?