Dockerfileでヒアドキュメントが書けるようになった
はじめに
Docker社から以下のDockerfileでヒアドキュメントが書けるようになった旨のアナウンスがありました。
これまで
これまでDockerfileでは以下のような書き方をしていました。
FROM ubuntu:20.04 RUN apt-get update && \ apt-get -y upgrade && \ apt-get -y install vim EOF
RUN1行で収めるために && \
でコマンドを繋げる書き方をしていました。
これから
Dockerビルド時にBuildKitを有効にすることで、Dockerfileにヒアドキュメントを書くことが出来るようになったので以下のような記述が可能になりました。
# syntax=docker/dockerfile:1.3-labs FROM ubuntu:20.04 RUN <<EOF apt-get update apt-get -y upgrade apt-get -y install vim EOF
これですっきり書けるようになりました。
BuildKit
今回Dockerビルド環境はMacOSのDocker Desktopで試しました。
Docker Desktop for Macはバージョン3.2.0からBuildKitがデフォルトで有効状態になるようになっていました。 なので特に設定変更なくビルドが可能でした。
わざとBuildKitを無効化してビルドしてみると以下のようにエラーとなりました。
$ DOCKER_BUILDKIT=0 docker build -t tsunokawa/docker-buildkit-test . Sending build context to Docker daemon 2.048kB Error response from daemon: dockerfile parse error line 5: unknown instruction: APT-GET
Docker Compose for Amazon ECSを試す
概要
下記記事にありますとおり、Docker Compose to ECS pluginを用いることで
これまでDocker Composeで起動していたコンテナ群をECSへデプロイすることが可能となります。
サンプルアプリケーション
動作確認をおこなうため公式のサンプルアプリケーションを利用させてもらいます。
下準備
Contextの確認
以下コマンドで現在のContextを確認します。
docker context list
表示結果例
$ docker context list NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm
ECS用のContext作成
以下コマンドで ecstest
というContextを新規作成します。
docker context create ecs ecstest
表示結果例
? Create a Docker context using: [Use arrows to move, type to filter] > An existing AWS profile AWS secret and token credentials AWS environment variables
対話形式のプロンプトが表示されます。
> An existing AWS profile
を選択します。
? Create a Docker context using: An existing AWS profile ? Select AWS Profile [Use arrows to move, type to filter] > default
どのAWS Profileを使用するか選択肢が表示されます。
> default
を選択します。
? Create a Docker context using: An existing AWS profile ? Select AWS Profile default Successfully created ecs context "ecstest"
無事選択が完了すると上記のような表示になります。
再度Contextを確認
再度下記コマンドでContextを確認します。
docker context ls
表示結果例
$ docker context ls NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR default * moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm ecstest ecs
ecstest
というContextが追加されていることを確認します。
Contextを選択
現在まだ ecstest
というContextが追加されただけで有効状態となっていないため、
以下コマンドでContextを有効化します。
docker context use ecstest
表示結果例
$ docker context use ecstest ecstest
Contextを確認
再度Contextを確認すると ecstest
に *
マークが付いて有効状態になっていることが分かります。
docker context list
表示結果例
$ docker context list NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock https://xxx.xxx.xxx.xxx (default) swarm ecstest * ecs
ECR認証
以下コマンドを実行してECRの認証を事前に済ませてください。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
※リージョンやリポジトリURLはご自身ものと読み替えてください。
表示結果
Login Succeeded
docker-compose.yml
の以下を修正
冒頭でご紹介しましたサンプルアプリケーションの docker-compose.yml
を以下のように編集してください。
x-aws-pull_credentials: <<<your arn for your secret you can get with docker ecs secret list>>>
↓
削除
image: <<<your docker hub user name>>>/timestamper
↓
image: xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example
コンテナのビルド
docker compose build
表示例
backend uses an image, skipping Building frontend [+] Building 48.7s (11/11) FINISHED => [internal] load build definition from Dockerfile 0.3s => => transferring dockerfile: 273B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/python:3.7-alpine 5.1s => [auth] library/python:pull token for registry-1.docker.io 0.0s => [internal] load build context 0.1s => => transferring context: 6.03kB 0.0s => [1/5] FROM docker.io/library/python:3.7-alpine@sha256:210d832835bdgfe6c8e9f5d9ced848cf5f0e12211d39af52f0583b31f1bd197e 30.9s => => resolve docker.io/library/python:3.7-alpine@sha256:210d832835b56fe6c8e9f5d9cehgt48cf5f0e12211d39af52f0583b31f1bd197e 0.0s => => sha256:93ac4b41defece5c1a3aa47ac94370ff375e952ee425987fcd4601988ed6c840 7.85kB / 7.85kB 0.0s => => sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f8617nh63beeddb6b 2.81MB / 2.81MB 12.0s => => sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cf43c8oaq7c1e037ec 281.51kB / 281.51kB 3.8s => => sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6be15dkgwee489eb 10.58MB / 10.58MB 28.6s => => sha256:210d832835b56fe6c8e9f5d9ced848cf5f0e12211d39af52f0583b319jrtd197e 1.65kB / 1.65kB 0.0s => => sha256:74bea4dba75d8ceca71f194565de5b5e39991861b417b1428f0kg9bc6ecd4065 1.37kB / 1.37kB 0.0s => => sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a871137fa6f14b126872 232B / 232B 4.2s => => sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e282c1c324d4e551hhe6 2.35MB / 2.35MB 18.4s => => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861pok63beeddb6b 0.6s => => extracting sha256:1174600ee52d100500456dc0a808ba63ee6961c12e35603cmhyc8207c1e037ec 0.2s => => extracting sha256:437edbe431b956a80d5c50783f7d5415c83187b0f74deb1e6bpatd3b1ee489eb 1.2s => => extracting sha256:1416265535ec68c82e9b39da6f113db62431d1d93641a87mki7fa6f14b126872 0.0s => => extracting sha256:dbf9391f7b29a85e3073a96afee48c33cd204ebf4979e28165c324d4e55180e6 0.5s => [2/5] WORKDIR /app 0.9s => [3/5] COPY requirements.txt /app 0.1s => [4/5] RUN pip3 install -r requirements.txt 10.5s => [5/5] COPY . /app 0.1s => exporting to image 0.5s => => exporting layers 0.5s => => writing image sha256:0570776b094200efc8798a5566bc3cedbabc5qyc0ee728de34450eab67964918 0.0s => => naming to xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest 0.0s
ECRへpush
以下コマンドでECRへイメージをpushします。
docker-compose push
表示結果例
$ docker-compose push Pushing frontend (xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest)... The push refers to repository [xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example] f760601fbeaf: Pushed aa72e78c2b9c: Pushed 494997b28f0c: Pushed 633f227y15e9: Pushed c1bf34232224: Pushed cbce3a4hccab: Pushed 761ad82fb613: Pushed 97c7d4badd08: Pushed 72e830andff5: Pushed latest: digest: sha256:710ef7409a8ced381d9903b47adbccd43f2a2boijnc47aab3d09b823d1d5d51e3 size: 2201
ECRリポジトリを確認
以下コマンドでECRのリポジトリを確認して正常にイメージがpushされているか確認します。
aws ecr list-images --repository-name example
表示結果例
$ aws ecr list-images --repository-name example { "imageIds": [ { "imageDigest": "sha256:710ef7409a8ced381d9903b47adbccd43f2a2b469c470633d09b823d1d5d51e3", "imageTag": "latest" } ] }
ECSへデプロイ
以下コマンドでECSへデプロイをおこないます。
$ docker compose up
表示結果例
$ docker compose up WARNING services.build: unsupported attribute [+] Running 18/18 ⠿ example CreateComplete 263.0s ⠿ LoadBalancer CreateComplete 153.9s ⠿ CloudMap CreateComplete 48.2s ⠿ Cluster CreateComplete 8.2s ⠿ FrontendTCP5000TargetGroup CreateComplete 1.2s ⠿ DefaultNetwork CreateComplete 8.2s ⠿ BackendTaskExecutionRole CreateComplete 15.8s ⠿ LogGroup CreateComplete 2.1s ⠿ FrontendTaskExecutionRole CreateComplete 16.5s ⠿ DefaultNetworkIngress CreateComplete 0.0s ⠿ Default5000Ingress CreateComplete 0.0s ⠿ BackendTaskDefinition CreateComplete 5.4s ⠿ FrontendTaskDefinition CreateComplete 1.8s ⠿ FrontendServiceDiscoveryEntry CreateComplete 2.0s ⠿ BackendServiceDiscoveryEntry CreateComplete 2.0s ⠿ BackendService CreateComplete 79.5s ⠿ FrontendTCP5000Listener CreateComplete 3.3s ⠿ FrontendService CreateComplete 97.3s
LoadBalancerのエンドポイント確認
以下コマンドでECSにデプロイをおこなったコンテナのエンドポイントを確認することが出来ます。
docker compose ps
表示結果例
$ docker compose ps NAME SERVICE STATUS PORTS task/example/afd1257f2411475fakoa5647de8ddbfb frontend Running examp-LoadB-XXXXX-xxxxx.elb.ap-northeast-1.amazonaws.com:5000->5000/tcp task/example/ea9d2b531f794a4ba6vvx2a03c63cdad backend Running
ブラウザでエンドポイントへアクセス
先程確認したエンドポイントにブラウザからアクセスします。
表示結果例
リソースの削除
以下コマンドで関連リソースが一括で削除されます。
docker compose down
表示結果
$ docker compose down [+] Running 18/18 ⠿ example DeleteComplete 513.5s ⠿ DefaultNetworkIngress DeleteComplete 1.0s ⠿ Default5000Ingress DeleteComplete 1.0s ⠿ FrontendService DeleteComplete 386.0s ⠿ FrontendServiceDiscoveryEntry DeleteComplete 0.6s ⠿ BackendService DeleteComplete 64.5s ⠿ FrontendTCP5000Listener DeleteComplete 1.2s ⠿ FrontendTaskDefinition DeleteComplete 0.6s ⠿ FrontendTaskExecutionRole DeleteComplete 1.0s ⠿ LoadBalancer DeleteComplete 0.9s ⠿ FrontendTCP5000TargetGroup DeleteComplete 0.9s ⠿ BackendTaskDefinition DeleteComplete 1.8s ⠿ DefaultNetwork DeleteComplete 59.3s ⠿ Cluster DeleteComplete 0.9s ⠿ BackendServiceDiscoveryEntry DeleteComplete 0.9s ⠿ CloudMap DeleteComplete 46.0s ⠿ LogGroup DeleteComplete 1.2s ⠿ BackendTaskExecutionRole DeleteComplete 2.1s
上記でDocker ComposeでECSへデプロイ及びリソースの後片付けまで動作の確認が出来ました。
Argo CD v1.9以降の管理者パスワード確認手順
概要
Argo CD v1.8以前までは管理者パスワードはargocd-server
のPod名が初期パスワードとして設定されていましたが、
Argo CD v1.9以降はargocd-initial-admin-secret
に保存されそこから初期パスワードを取得する方式に変更になりました。
Argo CDのインストール
まずはじめにArgo CD用のNamespaceを作成します。
kubectl create namespace argocd
先程作成したNamespaceにArgo CDをインストールします。
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
表示例
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created serviceaccount/argocd-application-controller created serviceaccount/argocd-dex-server created serviceaccount/argocd-redis created serviceaccount/argocd-server created role.rbac.authorization.k8s.io/argocd-application-controller created role.rbac.authorization.k8s.io/argocd-dex-server created role.rbac.authorization.k8s.io/argocd-redis created role.rbac.authorization.k8s.io/argocd-server created clusterrole.rbac.authorization.k8s.io/argocd-application-controller created clusterrole.rbac.authorization.k8s.io/argocd-server created rolebinding.rbac.authorization.k8s.io/argocd-application-controller created rolebinding.rbac.authorization.k8s.io/argocd-dex-server created rolebinding.rbac.authorization.k8s.io/argocd-redis created rolebinding.rbac.authorization.k8s.io/argocd-server created clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created clusterrolebinding.rbac.authorization.k8s.io/argocd-server created configmap/argocd-cm created configmap/argocd-gpg-keys-cm created configmap/argocd-rbac-cm created configmap/argocd-ssh-known-hosts-cm created configmap/argocd-tls-certs-cm created secret/argocd-secret created service/argocd-dex-server created service/argocd-metrics created service/argocd-redis created service/argocd-repo-server created service/argocd-server created service/argocd-server-metrics created deployment.apps/argocd-dex-server created deployment.apps/argocd-redis created deployment.apps/argocd-repo-server created deployment.apps/argocd-server created statefulset.apps/argocd-application-controller created
管理者パスワード確認方法
Argo CD v1.9以降はargocd-initial-admin-secret
という名前のSecretにパスワード値が保存されています。
$ kubectl get secrets -n argocd argocd-initial-admin-secret -o yaml (略) apiVersion: v1 data: password: UGFzc3cwcmQK= kind: Secret (略)
Base64でエンコードされているので以下でデコードします。
$ echo "UGFzc3cwcmQK=" | base64 -D Passw0rd
管理画面
以下でポートフォワードをおこないArgo CDの管理画面へ接続できる状態にする。
kubectl port-forward svc/argocd-server -n argocd 8080:443
ブラウザ上から以下へアクセスします。
ログイン画面が表示されたらユーザ名をadmin
、パスワードを先程確認した値を入力することでログイン出来ます。