docker | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sun, 30 Jun 2024 01:05:05 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png docker | さゆフィクション http://it.kensan.net/it 32 32 Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良い https://it.kensan.net/laravel11-log.html Sun, 02 Jun 2024 00:51:23 +0000 http://18.181.252.126/it/?p=2004 Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。

Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標準出力可能ですので、設定しておいた方が良いと思います!

なぜ、ログをJSON形式で標準出力するのか

なぜJSON形式か

JSON形式はデータを構造化し、分析や監視ツールで扱いやすい形式です。

また、新しい情報を追加するのも容易なため、ログ出力はJSON形式が良いと考えています。

JSON化しておけば、たとえば、AWSのCloudWatchでログ検索する際などで便利です。

なぜ標準出力か

多くのクラウドプロバイダーは、コンテナの標準出力からログを収集し、そのログを分析や可視化するためのツールやサービスを提供しているためです。

AWSで言うと、Fargateでのコンテナでログを標準出力すると、CloudWatchログの1つのロググループにまとまってくれて、簡単にログ検索できます。

これにより、運用やデバッグがスムーズに行えます。

以下の記事のようなメトリクスフィルターも簡単に作れたりします。

CloudWatchLogsのメトリクスフィルターの使い方ーログデータをメトリクス化して監視する
メトリクスフィルターを使いCloudWatchLogsのログデータを 「CloudWatchのメトリクスで見える化する」「メトリクスを監視してアラートをあげる」ということをやってみます。JSONログデータのメトリクス化も可能です。メトリクス化ができれば監視は通常のアラーム設定と同様となります

では、Laravel11を例にログをJSON形式で標準出力する方法を記載します。

Laravel11でログをJSON形式で標準出力する

config/logging.phpの修正

  • config/logging.phpの2箇所修正します
    •  「use Monolog\Formatter\JsonFormatter;」を追加
    • channelsの中に以下のようにstdoutを追加


use Monolog\Formatter\JsonFormatter;   // これを追加
:
:
:



    'channels' => [
        // 以下を追加
        'stdout' => [
            'driver' => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => StreamHandler::class,
            'with' => [
                'stream' => 'php://stdout',
            ],
            'formatter' => JsonFormatter::class,
        ],

.envの修正

.envを修正します。

以下のように、LOG_CHANNEL=stackをコメントアウトして、LOG_CHANNEL=stdoutを追加します。


#LOG_CHANNEL=stack  // コメントアウト
LOG_CHANNEL=stdout  // 追加

 

動作確認

routes/web.phpでログ出力するようにして動作確認します。

  •  routes/web.phpの2箇所を修正します
    • 「use Illuminate\Support\Facades\Log;」を追加する
    • 「Log::debug(‘test’);」を追加する
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;   // 追加

Route::get('/', function () {
    Log::debug('json_log_test');   // 追加
    return view('welcome');
});

Laravelアプリにアクセスし、以下のようにターミナル上に出力されれば、JSON形式でログを標準出力できています。


{"message":"json_log_test","context":{},"level":100,"level_name":"DEBUG","channel":"local","datetime":"2024-06-02T00:27:24.540572+00:00","extra":{}}

まとめ

Laravelをコンテナで運用する際には、ログをJSON形式で標準出力することで、運用やデバッグを効率化できます。設定方法も簡単です!

]]>
Rails7.1をfargateで動かしてみる https://it.kensan.net/rails7-1-fargate.html Sat, 18 May 2024 06:53:21 +0000 http://43.206.130.170/it/?p=1931 Rails7.1をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

  1. ローカルでRails7.1を立ち上げる
  2. ECR(Amazon Elastic Container Registry)にRailsイメージをpushする
  3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

まずは、ローカルでRails7.1を起動していきます。

ローカルでRialsを動かしてみる

アプリケーションの作成

以下のコマンドでアプリケーションを作成して、作成したアプリケーションのフォルダに移動します。

rails new test_app

cd test_app/

 

まずはDockerfileを修正します。

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。
#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

コンテナを立ち上げて動作確認

以下のコマンドでビルドします。

docker build . -t test_app --build-arg ENVIROMENTS='development'

以下のコマンドでコンテナを起動します。

docker run -it -p 3000:3000 --env RAILS_MASTER_KEY=`cat config/master.key` test_app bin/rails server -b 0.0.0.0

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

 

ECR(Amazon Elastic Container Registry)にRailsイメージをpush

以下のコマンドで、AWSの接続設定をしておきます。

aws configure

次にECRログインします。


aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドでリポジトリを作成します。


aws ecr create-repository \
        --repository-name rails \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1 

Railsアプリのタグ作成します

docker tag test_app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest

Railsアプリのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest

 

次に、Fagateにデプロイします!

ECS(Amazon Elastic Container Service)-Fagateにデプロイ

クラスターの作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャ:AWS Fargate (サーバーレス)

タスク定義の作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャの要件
    • 起動タイプ:AWS Fargate
    • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
      • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
    • タスクサイズ
      • CPU:.5 vCPU
      • メモリ:1GB
  • コンテナ – 1
    • 名前:app
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/rails:latest
    • コンテナポート:3000
    • アプリケーションプロトコル:HTTP
    • 環境変数
      • キー:RAILS_MASTER_KEY
      • 値:「config/master.key」の値を直接入力
        • cat config/master.key」を入力すると「ArgumentError: key must be 16 bytes (ArgumentError)」エラーになる
    • Docker設定
      • コマンドに以下を設定
        • /rails/bin/rails,server,-b,0.0.0.0

タスク起動

作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

  • コンピューティング設定:起動タイプ
  • デプロイ設定
    • ファミリー:先ほど作成したタスクを設定
    • リビジョン:最新
  • ネットワーキング
    • セキュリティグループ:ポート3000の許可を追加

動作確認

作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

パブリックIPが表示されるので、http://パブリックIP:3000でブラウザからアクセスします。

以下の画面が表示されればOKです。

]]>
Rails7.1をローカル環境で動かしてみる https://it.kensan.net/rails7-1-local.html Sat, 18 May 2024 06:39:28 +0000 http://43.206.130.170/it/?p=1928 Rails7.1をローカル環境で動かしてみます!

PC上で直接動かし、その後にDockerコンテナ上で動かしてみます。

コンテナでは、rails newで作成された公式のDockerfileを使用していきます。

Ruby・Railsのインストールから始めていきます!

Ruby/Railsのインストール

Rubyインストール

  • rbenvをインストールする
brew install rbenv
  • rbenvからインストールできるRubyのバージョンを確認する
rbenv install -l
  • リスト内から最新バージョンを確認して,Rubyをインストールする(ここでは3.3.1をインストールします)
rbenv install 3.3.1
rbenv global 3.3.1
  • rbenvのRubyに切り替えます
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
source ~/.zprofile

Railsインストール

  • Railsをインストールします
sudo gem install rails

rails --version

Rails 7.1.3.3

Rails7.1がインストールできました。

アプリケーションの作成

以下のコマンドでアプリケーションを作成して、作成したアプリケーションのフォルダに移動します。

rails new test_app

cd test_app/

ローカルでRialsを動かしてみる

以下のコマンドでRailsサーバーを立ち上げます。

bin/rails server

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

PC上にdockerコンテナを立ち上げ、その上でRailsを動かす

dockerコンテナを立ち上げ、その上でRailsを動かします。

まずはDockerfileを修正します。

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。
#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

コンテナを立ち上げて動作確認

以下のコマンドでビルドします。

docker build . -t test_app --build-arg ENVIROMENTS='development'

以下のコマンドでコンテナを起動します。

docker run -it -p 3000:3000 --env RAILS_MASTER_KEY=`cat config/master.key` test_app bin/rails server -b 0.0.0.0

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

docker composeを使ってみる

docker composeで以下の3つのコンテナを立ち上げてみます。

  •  DBコンテナ
    • MySQL8
  • appコンテナ
    • Rails7.1
  • phpmyadmin
    • 最新のphpmyadmin

Rails アプリの作成

以下のコマンドでRailsアプリを作成します。

rails new . --force --database=mysql

Dockerfileの修正

Rails newで作成されたDockerfileを修正します。

vi Dockerfile

以下の2点変更します。

<変更①>「ENV RAILS_ENV="production"」をコメントアウトして、「ENV RAILS_ENV=$ENVIROMENTS」を追記します。
#ENV RAILS_ENV="production" \
ENV RAILS_ENV=$ENVIROMENTS \
<変更②>
5行目のFORMの後に以下を追加
ARG ENVIROMENTS

上記変更を加えることで、Railsを以下の指定をして、起動できるようになります。

  • production
  • development
  • tesst

docker-compose.ymlの作成

以下の通り作成します。

vi docker-compose.yml

<ファイルの中身>


version: "3"
services:
  app:
    container_name: app_rails
    build:
      args:
        ENVIROMENTS: development
        RAILS_MASTER_KEY: 'cat config/master.key'
    command: bin/rails server -b 0.0.0.0
    volumes:
      - .:/rails
    ports:
      - 80:3000
    tty: true
    stdin_open: true
    depends_on:
      - db
  db:
    image: mysql:8.0.28
    container_name: db
    environment: 
      MYSQL_ROOT_PASSWORD: password
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:  
      - ./docker/db/data:/var/lib/mysql
    ports:
      - 3306:3306
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin
    environment:
    - PMA_USER=root
    - PMA_PASSWORD=password
    ports:
    - 8080:80
    depends_on:
      - db

DB設定ファイルの修正

vi config/database.yml

<ファイルの中身>

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db

development:
  <<: *default
  database: test4_development

動作確認

以下のコマンドでコンテナを立ち上げます。

docker compose up

以下のコマンドでDB作成します。

docker-compose run app bin/rails db:create

http://localhost:3000/にアクセスし、以下の画面が表示されれば、動作確認OKー

アプリコンテナのOSを確認してみる

以下のコマンドでOSを確認してみました。

docker compose exec app bash

cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Debian12が使われているようです。

rails newで作成された公式のDockerfileでは、Debian12が使われているようです…!

]]>
DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。 https://it.kensan.net/docker-laravel-11-phpmyadmin.html Mon, 06 May 2024 02:07:18 +0000 http://13.112.45.21/it/?p=1844 DockerでLaravel 11のローカル開発環境を構築していきます。

DB確認用に、phpmyadminもインストールします。

コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。

  • アプリコンテナ
    • PHP:8.3をインストールして、Laravel 11をインストールする
  • Nginxコンテナ
    • 最新のNginxをインストール
  • DBコンテナ
    • MySQL:8.0.36をインストール
  • phpmyadminコンテナ
    • 最新のphpmyadminをインストール(現時点の最新バージョン5.2.1をインストール)

では実際にローカル開発環境を構築していきます。

各コマンドをコピペで環境構築できます!

Laravelのローカル開発環境構築

まずは、完成系のディレクトリ構成から記載します。

ディレクトリ構成

以下のような構成となります。


├── docker
│   ├── db  # MySQL(DB)コンテナの設定ファイル等を入れるディレクトリ
│   │   └── my.cnf
│   ├── nginx  # nginxコンテナの設定ファイル等を入れるディレクトリ
│   │   └── default.conf
│   └── php  # アプリ(PHP)コンテナの設定ファイル等を入れるディレクトリ
│       └── Dockerfile
└── docker-compose.yml

ディレクトリの作成

上記ディレクトリ構成を作成するためのディレクトリを作成します。

mkdir test_laravel
cd test_laravel/

準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

docker-compose.ymlの作成

docker-compose.ymlを作成します。

vi docker-compose.yml

<ファイルの中身>


version: '3'
services:
  app:
    container_name: app_laravel  
    build: ./docker/php
    volumes:
      - .:/var/www
  nginx:
    image: nginx 
    container_name: nginx
    ports:
      - 8000:80 
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www
    depends_on:
      - app
  db:
    image: mysql:8.0.36
    container_name: db
    environment: 
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: database 
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:  
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin
    environment:
    - PMA_USER=root
    - PMA_PASSWORD=password
    ports:
    - 8080:80

MySQLのmy.confを作成

MySQLのmy.confを作成します。

mkdir docker

mkdir docker/db

vi docker/db/my.conf

<ファイルの中身>


[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

[client]
default-character-set=utf8mb4

nginxのdefault.confを作成

nginxのdefault.confを作成します。

mkdir docker/nginx

vi docker/nginx/default.conf

<ファイルの中身>


server {
  listen 80;
  root /var/www/laravel-project/public;
  index index.php;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000; 
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

アプリコンテナのDockerfile作成

アプリコンテナのDockerfile作成を作成します。

mkdir docker/php

vi docker/php/Dockerfile

<ファイルの中身>


FROM php:8.3-fpm

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

コンテナ立ち上げ

以下のコマンドでコンテナを立ち上げます。

docker compose up -d

Laravel 11のインストール

アプリコンテナの中に入りLaravel11をインストールします。

# アプリコンテナに入るコマンド
docker compose exec app bash
# Laravel11インストールコマンド
composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

DBの接続先をsqlliteからmysqlに変更します。

vi laravel-project/.env

<ファイルの中身(DB設定箇所を編集します)>

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password

以下のコマンドでマイグレーションを実行します。

cd laravel-project/
php artisan migrate

以上で環境が出来上がりましたので、最後に動作確認します!

動作確認

  • http://localhost:8000/にアクセスして
    • 以下のLaravelの画面が見れればOK
  • http://localhost:8080/にアクセスして
    • phpmyadminが見れればOK

sailを使う場合

以下のコマンドでプロジェクトインストールします。

curl -s "https://laravel.build/example-app" | bash

以下のコマンドでコンテナを立ち上げます。

cd プロジェクト名 && ./vendor/bin/sail up

ブラウザで「http://localhost/」 へアクセスすると以下のエラーが出ます。

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist

「RUN MIGRATIONS」をクリックした後、「Refresh now」をクリックするとLaravelのスタート画面が表示されます。成功〜〜

]]>
Docker ビルドして、ビルド結果を判定するシェルスクリプトの作り方(「$?」ドルマーク+クエスチョンマーク使用) https://it.kensan.net/docker-success-fail.html Sun, 12 Mar 2023 23:59:08 +0000 http://3.113.9.194/it/?p=797 本記事では、Dockerfileをビルドして、ビルドの成功失敗を判定するシェルスクリプトの作り方について記載します。

具体的には以下のことをやっていきます。

本記事でやること

①シェルファイルを作成する
②シェルファイルの中でDockerビルドする
③ビルドした結果、成功or失敗で処理を分岐させる

本記事のポイント

ポイントは以下の通りです。

  • Dockerビルドの結果は「$?(ドルマーク+クエスチョンマーク)」にはいる
    • 成功時の「$?(ドルマーク+クエスチョンマーク)」は「0」になる

動作確認していきます。

まずは、動作確認に必要なファイルを作成していきます。

必要なファイルの作成

以下の2つのファイルを作成します。

作成する2つのファイル

シェルファイル
Dockerfile

 

シェルファイルを作成する

「build.sh」というファイルを作成します


docker build -t test ./
if [ $? -eq 0 ]; then
    echo "build success"
    # ここにデプロイコマンドとか書く
else
    echo "build fail"
fi

 

Dockerビルドして、

  • 成功時:build success
  • 失敗時:build fail

というメッセージを出すスクリプトになっています。

Dockerビルドの結果は「$?」に格納されます。

作成したファイルに実行権限を付与します。

chmod 755 build.sh

Dockerfileを作成する

「Dockerfile」というファイルを作成します

From nginx
# curlインストール
RUN apt-get update \
&& apt-get install -y curl

 動作確認

成功時

以下のコマンドで実行します。

./build.sh

build successと表示され成功したことがわかります。

失敗時

「Dockerfile」以下のように変更します

  • curl->culr2に変更
From nginx
# curlインストール
RUN apt-get update \
&& apt-get install -y curl2

以下のコマンドで実行します。

./build.sh

build failと表示され失敗したことがわかります。

まとめ

  • シェルファイルを作成する
  • シェルファイルの中でDockerビルドする
  • ビルドした結果、成功or失敗で処理を分岐させる

ということをやってみました。成功時にデプロイコマンドを実行させれば、成功した時だけデプロイするという安全あデプロイスクリプトを作成できますね。

Docker公式:https://docs.docker.com/

 

]]>
M1 MacでDockerを使う際のノウハウとエラーの解決方法 https://it.kensan.net/m1-mac-docker-build.html Thu, 23 Feb 2023 21:41:45 +0000 http://ec2-13-112-80-120.ap-northeast-1.compute.amazonaws.com/it/?p=317 「Intel Macで動いていたDockerイメージがM1 Macにパソコンで動かない…」そんな方向けの記事です。

なぜIntel Macで動いていたDockerイメージがM1 Macでは動かなくなるのか、それはCPUアーキテクチャが異なるためです。

ビルド済みのイメージがM1 Mac上で動くようにする方法から書いていきます!

とりあえず動くようにする(docker runできるようにする)対策

以下のように「–platform linux/x86_64」を指定して、あげると大抵のケースで動くようになります。

docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=password-d mysql:latest

Docker Composeの場合は以下のように指定する。


version: '3'
services:
  mysql:
    image: mysql:latest
    platform: linux/amd64
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 127.0.0.1:3308:3306

次に、ビルドについて書いていきます!

ビルドできるようにする(docker buildできるようにする)対策

これはなかなか難しいです。

Dockerファイル次第ですがエラー続出したりします。

対応方法は2つです。

2つの対応方法

根気強くエラーを潰す
EC2でビルドする

    根気強くエラーを潰すについて、書いていきます。

    根気強くエラーを潰す

    docker buildする→エラーが出る→エラーの原因を探り対応する→docker buildする→エラーが出る…..といった形でエラーがなくなるまで根気強くエラーを潰す対応です。

    なかなか大変なのと、上記対応でbuildできるDockerファイルができたとしても、次の悩みが今度は出てきます。

    • intel PCで動くのか(チーム内にintel PCの人がいる場合)
    • 動作保証するために、影響範囲・テストなど実施する必要がある

    (大変なのでこのやり方はお勧めしません…)

    次は、EC2でビルドする方法を書いていきます。こちらがオススメの方法です。

    EC2でビルドする

    AWSのEC2(Intel CPU)を使ってビルドする方法です。

    docker buildはEC2でやってdocker runだけ自分のM1 Macでやればいいという発想です。

    ここにたどり着くまで苦労しましたが、これが一番ラクでオススメな方法です!

    次は、デプロイについて書いていきます!

    デプロイする

    2つのデプロイ方法が考えられます。

    2つのデプロイ方法

    Intel PCでビルドしてデプロイ
    M1 Macでビルドしてデプロイ

    Intel PCでビルドしてデプロイ(オススメ)

    デプロイ先は恐らくIntel CPUのことが多いので、Intel PCでビルドするのがお勧めです。

    M1 Macでビルドしたものはデプロイに失敗することもあります。

    基本的にはEC2(Intel CPU)もしくはCodebuildを使ってビルドしてからデプロイするのが良いです。

    M1 Macでビルドしてデプロイ

    AWS ECS FargateではM1 CPUにも対応しているようです。

    AWS ECS Fargateを使い、CPUをARMにしておくと、M1 Macでビルドしたイメージをそのままデプロイして動作させることができます。

    (以下の記事をご参照ください。ARM=M1と置き換えて読んでいただ方がわかりやすいです)

    Amazon ECSの 64-bit ARM ワークロードの操作 - Amazon Elastic Container Service
    クラスターに登録された 64 ビット ARM インスタンスで、高パフォーマンスコンピューティング、CPU ベースの機械学習推論、動画エンコーディング、電子設計の自動化、ゲーミング、オープンソースデータベース、インメモリキャッシュアプリケーションなどを実行できます。

    まとめ

    M1 MacでDockerを使うポイントとエラーとの向き合い方についてみてきました。

    チーム内でM1とIntelが共存しているとなかなか厄介そうですね。

    そのうちM1とIntelを気にしなくて良くなる日が来ることを期待していますー

    ]]>