20220116のdockerに関する記事は14件です。

多分一番簡単なDockerでのPHP環境構築

ちょろっといじりたいときとか下記コマンドでPHPの環境が構築できる 下記コマンドを実行 mkdir workspace cd workspace docker run -p 8080:80 -v path-to-workspace/www:/var/www/html --name php80 -d php:8.0-apache docker exec -ti php80 bash touch index.php echo '<?php phpinfo();' > index.php 下記にアクセス http://localhost:8080
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails(Docker)+nginxでPermission denied @ rb_io_reopen - /myapp/log/puma.stdout.log (Errno::EACCES)が発生する

はじめに Rails環境をDockerを利用して環境構築していたのですが、Nginxをつないだところエラーが発生してほかの記事があまり参考にならなかったため自分なりにまとめていきます。 主にWSL2でDockerを使っている方がこのエラーの対象になるかと思います。 問題 DockerでRailsとNginxの環境を用意して、Railsコンテナのユーザーをapp(rootではない)にdocker-compose.ymlで変更した状態でコンテナを起動すると以下のエラーが発生します。 rails | * Listening on http://0.0.0.0:3000 rails | * Listening on unix:///myapp/tmp/sockets/puma.sock rails | Use Ctrl-C to stop rails | bundler: failed to load command: puma (/usr/local/bundle/bin/puma) rails | /usr/local/bundle/gems/puma-5.5.2/lib/puma/runner.rb:123:in `reopen': Permission denied @ rb_io_reopen - /myapp/log/puma.stdout.log (Errno::EACCES) rails | from /usr/local/bundle/gems/puma-5.5.2/lib/puma/runner.rb:123:in `redirect_io' rails | from /usr/local/bundle/gems/puma-5.5.2/lib/puma/single.rb:56:in `run' rails | from /usr/local/bundle/gems/puma-5.5.2/lib/puma/launcher.rb:181:in `run' rails | from /usr/local/bundle/gems/puma-5.5.2/lib/puma/cli.rb:80:in `run' rails | from /usr/local/bundle/gems/puma-5.5.2/bin/puma:10:in `<top (required)>' rails | from /usr/local/bundle/bin/puma:25:in `load' rails | from /usr/local/bundle/bin/puma:25:in `<top (required)>' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `load' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:58:in `kernel_load' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli/exec.rb:23:in `run' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli.rb:478:in `exec' rails | from /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' rails | from /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' rails | from /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli.rb:31:in `dispatch' rails | from /usr/local/lib/ruby/3.0.0/bundler/vendor/thor/lib/thor/base.rb:485:in `start' rails | from /usr/local/lib/ruby/3.0.0/bundler/cli.rb:25:in `start' rails | from /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:49:in `block in <top (required)>' rails | from /usr/local/lib/ruby/3.0.0/bundler/friendly_errors.rb:103:in `with_friendly_errors' rails | from /usr/local/lib/ruby/gems/3.0.0/gems/bundler-2.2.32/libexec/bundle:37:in `<top (required)>' rails | from /usr/local/bin/bundle:23:in `load' rails | from /usr/local/bin/bundle:23:in `<main>' rails exited with code 1 Permission denied @ rb_io_reopen - /myapp/log/puma.stdout.log (Errno::EACCES)ということでpuma.stdout.logが権限的にみれないよとエラーを出しています。 調査 これはpumaのログがコンテナ内でroot権限で作成されることが原因です。 私の作成したdocker-compose.ymlは以下のようになっています。 docker-compose.yml version: "3.9" services: rails: build: . container_name: rails command: bundle exec puma -C config/puma.rb volumes: - .:/myapp - public-data:/myapp/public - tmp-data:/myapp/tmp - log-data:/myapp/log env_file: - .env depends_on: - db environment: WEBPACKER_DEV_SERVER_HOST: webpacker user: app webpacker: build: . volumes: - .:/myapp command: ./bin/webpack-dev-server environment: WEBPACKER_DEV_SERVER_HOST: 0.0.0.0 ports: - "3035:3035" db: image: mysql:8.0.27 container_name: db environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} ports: - "3306:3306" volumes: - db:/var/lib/mysql web: build: context: containers/nginx volumes: - public-data:/myapp/public - tmp-data:/myapp/tmp ports: - 80:80 depends_on: - rails volumes: db: driver: local bundle: driver: local public-data: tmp-data: log-data: ここで注目してほしいのはrailsコンテナのuser: appという箇所でユーザーを指定しているところです。これでコンテナ内でrails gなどでファイル生成してもappユーザー(uid=1000)で作成されるため、WSL2のユーザーと権限が同じなので編集ができるようになります。この設定をしないとrootユーザーでファイルが作成されるためWSL2ユーザーでは編集ができません。 しかし、appを指定したことでpumaログがroot権限で作成されているため編集できずエラーとなっていました。 ここで考えられるのは以下の方法です。 WSL2をrootでログインするように設定する コンテナ内の参照するフォルダ(と中身のファイル)の権限をappユーザーが開けるように変更する 今回はコンテナ内の/{workdir}/log(ここではmyapp/log)の権限を変更して対応していきます。 まずは実際に権限がrootになっているのか確認します。 いまのままではコンテナが落ちてしまうのでdocker-compose.ymlのrailsコンテナのコマンドを以下に変更します。 docker-compose.yml command: sh -c "while :; do sleep 10; done" && bundle exec puma -C config/puma.rb コンテナの中に入って以下のコマンドを打ちます。 # コンテナの起動 # $ docker-compose up # コンテナに入る # $ docker exec -it rails sh # 権限の確認 $ ls -la # rootになっている drwxr-xrwx 2 root root 4096 Jan 16 08:49 log この権限をappに変更できれば良さそうです。 こちらの記事によると、Volumesで設定するとrootになってしまうようです。 ここで2つの回避策を考えましたので紹介します。 回避策1 コンテナの中で権限を変更する コンテナの中で直接権限を変更します。 注意としてはrootでコンテナに入る必要があるので、docker-compose.ymlのuserをコメントにします。 rootであれば権限問題が起きないのでコンテナは立ち上がるかと思います。 # 別ターミナルを開く # コンテナに入る $ docker exec -it rails sh # 権限を変更する $ chown app:app -R /myapp/log chownでエラーが出る場合はrootユーザーになっていないのが原因かと思いますのでid -u -nコマンドで確認してください。 一度変更すれば以降は変更された状態になります。 しかし、ボリュームを削除したり、gitからダウンロードした場合にrootでアクセスしてdocker-compose.ymlを編集してuser:appに変更するという手間も発生するので微妙かなとは思いました。 回避策2 Nginxで権限変更のシェルを実行する 1の欠点を補うためにNginxコンテナを起動するときにシェルを走らせることで回避することにしました。 まず準備としてdocker-compose.ymlのNginxのボリュームを変更します。 docker-compose.yml web: build: context: containers/nginx volumes: - public-data:/myapp/public - tmp-data:/myapp/tmp - log-data:/myapp/log ports: - 80:80 depends_on: - rails myapp/logをvolumesに設定しました。 そして、Dockerfileでentrypoint.shを設定できるようにします。 FROM nginx:alpine # インクルード用のディレクトリ内を削除 RUN rm -f /etc/nginx/conf.d/* RUN adduser -D app -u ${UID:-1000} COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] # Nginxの設定ファイルをコンテナにコピー ADD nginx.conf /etc/nginx/conf.d/myapp.conf # ビルド完了後にNginxを起動 CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf 次にnginxのDockerfileと同じディレクトリにentrypoint.shを作成します。 entrypoint.sh #!/bin/sh set -e chown app:app -R /myapp/log exec "$@" ここまでの設定を行うことで、Nginxコンテナが立ち上がったときにentrypoint.shが実行され、volumesで設定されているmyapp/logの権限をappに変更します。また同じユーザーをDockerfileで作成することも忘れないようにしてください。 nginx自体はrootユーザーで起動するため権限変更chownが利用でき変更が可能です。 railsコンテナで同じように権限を変更しようとなるとrootでアクセスする必要があるため今回はnginxで権限を変更するように設定しました。 回避策3 マウントに権限を付与する マウントで権限を与える方法が分かりました。 tmpfsマウントを使うと権限を与えることが可能になります。 今回はコンテナ間で共有しないのでこれで良さそうです。 docker-compose.yml tmpfs: - /myapp/log:exec,mode=777,uid=1000,gid=1000 解決策 解決策はいたってシンプルでDockerfileでユーザーを追加して、ディレクトリコピーの時にchownすればOKでした。 FROM ruby:alpine3.13 ARG UID RUN adduser -D app -u ${UID:-1000} && \ # user追加 apk update \ && apk add --no-cache gcc make libc-dev g++ mariadb-dev tzdata nodejs~=14 yarn WORKDIR /myapp COPY Gemfile . COPY Gemfile.lock . RUN bundle install COPY --chown=app:app . /myapp # 権限を付与してコピー RUN chown app:app -R /myapp/node_modules/.bin COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] # EXPOSE 3000 # CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"] USER app # ユーザー変更 RUN mkdir -p tmp/sockets # フォルダ作成はユーザー設定してから RUN mkdir -p tmp/pids おわりに 権限問題が複雑に絡まっており解決するまで時間がかかりました。 調べてもよくわからず自分なりに工夫をして解決することができました。 参考 dockerでvolumeをマウントしたときのファイルのowner問題
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

M1macでRails6とNuxt3の環境をDockerで作る

前提 Apple M1チップのMacBook Air(macOS Big Sur, 8GB) 構成 Server Rails6.14 API mode Mysql5.7 Front Vue3/Nuxt3/TypeScript この記事でやること M1 macを使用して、Rails6.14 + Nuxt.js 3 の環境をDockerで作っていきます。 レポジトリもそれぞれAPIサーバーとフロントサーバーに分ける想定なので、ニコイチで作りたい方は docker-compose.ymlを一つにしてよしなに対応お願いします。 また、できるだけ参考にした記事などは共有しますが漏れていた場合は追記しますのでご指摘ください。 動機 仕事ではdockerを使ってはいるものの自分で一からセットアップしたことがなかったせいで 結構つまづく部分が多かったので作ってみたかった + 備忘録的に書いておこうと思った次第です。 今回この構成でサービスを作る予定なので宣伝も兼ねて環境構築手順を共有していきます。 サービスができたらこの下あたりにでもリンクを貼るのでお暇な方はどうぞ。 いつになったらリリースするのかとかは聞かないでください笑 ここ⇨ Railsの環境構築 全体の構成などはこちらの記事を参考にしました。 自分の場合と異なり、こちらの記事ではdocker imageにaplineを、dbにpostgresを採用しているため多少の違いがあります。 alpineやpostgresを使用したい場合はこちらを参考にするといいかもです。 ちなみにalpineを採用するメリットは軽量化(リリース時間が短くなるなど)だと思うのですが以前pdf作成機能を作った時に imagemagickなどが入っておらず苦労した覚えがあるため使用していません。 alpineの良し悪しに関する考察はこちらを参考にどうぞ 作業用ディレクトリを用意 ディレクトリ名などは各々好きに決めてください。 $ /Users/ユーザー名/workspace/rails-api ディレクトリ構成 rails-api └.env └Dockerfile └Gemfile └Gemfile.lock それでは一つずつ解説して行きます。 .envファイル # commons WORKDIR=rails-api <-ここをrootディレクトリ名と同じにする CONTAINER_PORT=3000 FRONT_PORT=8080 API_PORT=3000 # db MYSQL_ROOT_PASSWORD=password 環境変数が複数ある場合、.envという名前のファイルに環境変数のデフォルト値を設定することができます。 あるいはコマンドラインオプション--env-fileを使って環境変数ファイルへのパスを指定して利用することもできます。 公式にあるように、デフォルトで採用されている環境変数用のファイルです。 今回はこちらに環境変数を記載して行きます。 docker-compose.yml docker-compose.yml version: '3' services: db: image: mysql/mysql-server:5.7.28 container_name: db environment: MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD MYSQL_ROOT_HOST: '%' # コンテナ外からdbに接続するために記載 ports: - "3306:3306" # command: --default-authentication-plugin=mysql_native_password <- mysql8.0の場合に必要 api: stdin_open: true tty: true build: context: . args: WORKDIR: $WORKDIR command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" environment: MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD API_DOMAIN: "localhost:$API_PORT" APP_URL: "http://localhost:$FRONT_PORT" depends_on: - db ports: - "$API_PORT:$CONTAINER_PORT" volumes: - .:/rails-api 注意すべきは以下2点です。 1 . MYSQL_ROOT_HOST: '%' これはapiコンテナからdbコンテナに接続する場合に必要な設定になります。これを書かなかった場合、コンテナにログインしてmysqlを操作することはできますが、コンテナ外部から操作することができなくなります。 参考記事: 2 . command: --default-authentication-plugin=mysql_native_password こちらはmysql8.0を使用したい場合に必要になる設定です。他記事をみていますとmy.confに書いている方もいますが、今回はより簡易な手法としてこちらを記載しておきます。 参考記事: Dockerfile Dockerfile FROM ruby:3.0.2 ARG WORKDIR ENV HOME=/${WORKDIR} \ LANG=C.UTF-8 \ TZ=Asia/Tokyo WORKDIR ${HOME} COPY Gemfile* ./ RUN wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list RUN set -x && apt-get update -y -qq && apt-get install -yq nodejs yarn RUN bundle install COPY . . 環境変数の設定に関しては上記の記事を参考にさせていただきました。 ARGやENV、${WORKDIR}などは.envファイルから取得した環境変数をDockerfile、docker-compose.yml、コンテナで使用できるようにするためのものです。 詳細は上記の記事を読んでいただけると理解できると思いますので割愛します。 この記事ではパッケージマネージャーにapt-getを使用していますが、alpine環境を使用する場合はapkを使用する必要があるそうです。 Gemfile Gemfile source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } gem 'rails', '~> 6.1.4', '>= 6.1.4.4' Gemfile.lock こちらはからファイルを作成します。 手順 1 . まずは上で解説したディレクトリ構成でファイルを作成しましょう。 2 . Dockerfileを実行し、docker imageを作成します。 $ docker-compose build 3 . imageができたか確認します。 REPOSITORY TAG IMAGE ID CREATED SIZE rails-api_api latest 0d08728fc697 26 hours ago 1.01GB 4 . コンテナを起動してrailsアプリを作成します。以下コマンドは2で作成したdocker imageからapiコンテナを起動してrails newするものです。ここでコンテナ内にrailsアプリができた場合は自分のホスト環境のrails-apiディレクトリ配下にもrailsアプリが作成されているはずです。 $ docker-compose run --rm api rails new . -f -B -d mysql --api 5 . アプリが作成できたら、自分のホスト環境のdatabase.ymlファイルを修正しコンテナ内のdbと接続できるようにします。 database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: <%= ENV["MYSQL_ROOT_PASSWORD"] %> host: db 6 . database.ymlを修正したらもう一度ビルドし直し、dbを作成します。 $ docker-compose build $ docker-compose run --rm api rails db:create 7 . dbが作成できたらdocker環境を立ち上げます。 $ docker-compose up うまく立ち上がったら以上でrailsアプリの環境構築は完了です。 Nuxt3の環境構築 Nuxt3の環境もRailsの環境と大枠では一緒です。 ディレクトリ構成 nuxt-front L .env L docker-compose.yml L Dockerfile .env .env # commons WORKDIR=nuxt-front CONTAINER_PORT=3000 FRONT_PORT=8080 docker-compose.yml docker-compose.yml version: '3' services: nuxt: build: context: . args: WORKDIR: $WORKDIR tty: true command: yarn dev volumes: - .:/nuxt-front ports: - "$FRONT_PORT:$CONTAINER_PORT" Dockerfile Dockerfile FROM node:17-slim ARG WORKDIR ARG CONTAINER_PORT ARG API_URL ARG API_URL_BROWSER ARG FRONT_PORT ENV HOME=/${WORKDIR} \ LANG=C.UTF-8 \ TZ=Asia/Tokyo \ HOST=0.0.0.0 \ API_URL=${API_URL} \ API_URL_BROWSER=${API_URL_BROWSER} WORKDIR ${HOME} RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y git && \ yarn global add @vue/cli && \ yarn global add @vue/cli-init # COPY package*.json ./ # RUN yarn install # # COPY . ./ EXPOSE ${CONTAINER_PORT} 手順 1 . 上記ディレクトリ構成通りにフォルダ・ファイルを作成する。 2 . nuxt-frontディレクトリに移動する。 3 . Dockerfileを実行してimageを作成する この時、Dockerfileの下記部分をコメントアウトしておく。 # COPY package*.json ./ # RUN yarn install # # COPY . ./ 解説 ・COPY package*.json ./ 自分のホスト環境のpackage.jsonとpackage.json.lockをコンテナのWORKDIR(/nuxt-front)に配置する。 ・RUN yarn install 配置したpackage.jsonを元にパッケージをコンテナにインストール ・COPY . ./ 自分のホスト環境のnuxt-front配下をコンテナのnuxt-front配下にコピーする。 要は新しい機能を実装したりパッケージを追加したりした時に、自分のホスト環境の修正内容をコンテナにコピーして追加したパッケージをinstallすると言ったことを行なっている。 初めて環境構築する場合はそもそも自分のホスト環境にpackage.jsonもpackage.json.lockもないので、コメントアウトしておかないとエラーになるので注意。 image作成 $ docker-compose build 4 . docker環境を立ち上げ、コンテナ内でnuxtアプリを作成する まずdocker-compose.ymlのcommand: yarn dev部分をコメントアウトする。 ※ コンテナにnuxtアプリがない場合エラーになってしまうため $ docker-compose up 立ち上がったコンテナを確認する $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 879a1f3fa8e6 nuxt-front_nuxt "docker-entrypoint.s…" 19 hours ago Up 4 seconds 0.0.0.0:8080->3000/tcp nuxt-front_nuxt_1 コンテナに入る $ docker exec -it 879a1f3fa8e6 bash <- 879a1f3fa8e6は上で表示されたCONTAINER IDを指定する カレントディレクトリを確認 $ pwd /nuxt-front nuxt3アプリを作成する $ npx nuxi init app Nuxt CLI v3.0.0-27369360.33ebb01 18:14:05 ℹ cloned nuxt/starter#v3 to /Users/ユーザー名/workspace/nuxt-front/app 18:14:06 18:14:06 ? Another pioneering Nuxt project just made! Next steps: ? `cd app` ? Install dependencies with `npm install` or `yarn install` ? Start development server with `npm run dev` or `yarn dev` 結果的に現在のコンテナでのディレクトリ構成はこうなる nuxt-front L .degit L .npm L package.jsonなど L app L node_modules L app.vue L nuxt.config.ts L package.json...など L Dockerfile L docker-compose.yml 今回はapp配下の構成をnuxt-front配下に持ってきたいので、mvコマンドを使用してapp配下を移動させる。 例 $ mv app/{*,.*} ../nuxt-front その後からになったappディレクトリを削除する。 $ rm -rf app また、npx nuxi init appを実行すると.degitファイルと.npmディレクトリが作成されるが、 nuxtアプリとして本来必要なのはapp配下で、.degitと.npmは一部を除いて使用しないので最終的にはgitに含めなくても良いはず。 ※.degitと.npmについて この二つのファイル/ディレクトリはnuxt3をインストールする際に必要なnuxiパッケージを事前にインストールするために作成されるファイルと思われる。.nmp配下のpackage.jsonに以下の記述があるので、npx nuxi init appコマンドを叩いたときに.degitと.npmを作成 + npm installまでを自動で行なっているはず。(詳しく調べてないので間違ってたらコメントください。) .npm/package.json "devDependencies": { "nuxi": "^0.10.1" } なぜnuxiをインストールしているかというと、先ほどまでapp配下にあったpackage.jsonにスクリプトが作成されており、そこでnuxiコマンドを使用しているため。 サーバー立てる時と本番用にコンパイルするときに使用するっぽい。 Dockerfileでわざわざ2回に分けてyarn installしたくないのでこの内容をpackage.jsonに追加しておく。 追加できたら.degitと.npmは削除する。 package.json { "private": true, "scripts": {  "dev": "nuxi dev", <- ここでnuxiが使用されている "build": "nuxi build", <- ここでnuxiが使用されている "start": "node .output/server/index.mjs" }, "devDependencies": { "nuxt3": "latest", "nuxi": "^0.10.1" <- ここに追加 } } 5 . docker環境を立ち上げる Dockerfileとdocker-compose.ymlのコメントアウトを外す Dockerfile COPY package*.json ./ RUN yarn install COPY . ./ docker-compose.yml version: '3' services: nuxt: build: context: . args: WORKDIR: $WORKDIR tty: true # command: yarn dev <- ここのコメントアウトを外す volumes: - .:/nuxt-front ports: - "$FRONT_PORT:$CONTAINER_PORT" command: yarn devはdocker-compose upした際にサーバーを立ち上げる。 実際にはyarn devするとpackage.jsonに定義されていたscriptのnuxi devが実行されるため、 この後docker-compose upする際にnuxi: not found`などのエラーが出ていた場合はpackage.jsonに nuxiの記述が足りないため追加する。 package.json "devDependencies": { "nuxt3": "latest", "nuxi": "^0.10.1" <- ここが足りない } docker環境立ち上げ $ docker-compose up Nuxt CLI v3.0.0-27369360.33ebb01 nuxt_1 | nuxt_1 | > Local: http://localhost:3000/ nuxt_1 | > Network: http://172.20.0.2:3000/ nuxt_1 | 無事環境が立ち上がったらブラウザで http://localhost:8080/  にアクセスして以下の画面が出れば動作確認完了です。 スクリーンショット 2022-01-16 19.04.17 また、初めてyarn devした時に.nuxtディレクトリが作成されますが、docker-compose upしたら勝手に作成されるので gitに含めなくても大丈夫です。 後書き まとまりなく書いてしまったのですが誰かの役に立てれば幸いです。 今回作成した環境でサービス開発していく予定なので、何か記事化できそうなことがあれば書いて行くつもりです。 予定では以下のものを使用するつもりなのでそのうち記事にするかもです。 Graphql ユーザー認証: railsのdeviseかfirebase authか Github project(使用中) Github ActionsでCI/CD 決済: Pay.jpかstripe Atomic design Vuetify.js などなど
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker-composeでWEB・DBのDockerfileよりwordpressを構築する

目的 Dockerの理解を深めたいと考え、Docker-Composeを用いてWordpressの構築を行いました。 条件設定 ・AmazonLinux2のイメージを用いて構築する ・WEB用とDB用のコンテナそれそれ2台を用いる ・データの永続化  ログ記事を書いた後に、コンテナの再起動をしても書いたブログ記事がちゃんと  残ってるかどうか 環境設定 ・docker ver3.8 ・php ver7.3 ・Apache ・MySQL ・mariadb 構成 /opt/project   l  L docker-compose.yml   l---web   l   l-Dockerfile   l---db    l-Dockerfile    l-wordpress       l-db.opt 手順 1.ルート権限になる # sudo su - 2.Dockerのインストール # yum install docker 3.dockerの起動 # systemctl start docker 4.dockerのプロセスが通っているかの確認 # ps -ef | grep docker 5.dockerのシステム起動の確認 # systemctl status docker 6.作業ディレクトリの作成・移動 # mkdir /opt/project && cd /opt/project 7.web/dbのディレクトリを作成 # mkdir web # mkdir db 8.ymlファイルを作成 # vi docker-compose.yml docker-compose.yml ----------------------------------------- version: "3.8" services: #./webに作成したwordpressのDockerfileを使用して"docker-compose build"でwebという名前のイメージを作成 web: container_name: web build: ./web #ポート番号の指定 ports: - "80:80" tty: true #./dbに作成したMySQLのDockerfileを使用して"docker-compose build"でdbという名前のイメージを作成 db: container_name: db build: ./db #ポート番号の指定 ports: - "3306:3306" tty: true ----------------------------------------- 9.wordpressのDockerfileを作成 # cd /opt/project/web && vi Dockerfile /opt/project/web ----------------------------------------- #AmazonLinux2の環境を使用 FROM amazonlinux:2 #初期装備をインストール RUN yum -y install yum-utils tar wget procps epel-release RUN yum clean all #Apacheインストール RUN yum -y install httpd #PHPのインストール RUN amazon-linux-extras enable php7.3 RUN yum install -y php php-gd php-mysqlnd php-xmlrpc #wordpressインストール #ENV wpdl https://wordpress.org/latest-ja.tar.gz # wp download #RUN cd /var/www/html && wget -O - $wpdl | tar xzfv - #RUN mv /var/www/html/wordpress/* /var/www/html RUN wget https://wordpress.org/latest.tar.gz RUN tar -xzvf latest.tar.gz RUN mv /wordpress/* /var/www/html RUN chown -R apache:apache /var/www/html RUN chmod 2775 /var/www/html CMD [ "/usr/sbin/httpd", "-D", "FOREGROUND" ] ----------------------------------------- 10.データベースのDockerfileを作成 # cd /opt/project/db && vi Dockerfile /opt/project/db ----------------------------------------- FROM amazonlinux:2 #初期装備をインストール RUN yum install -y yum-utils tar wget procps epel-release #インストール RUN yum -y install mariadb mariadb-server #pingコマンド使用 RUN yum install -y iputils #port確認 EXPOSE 3306 # DB作成 RUN mkdir /var/lib/mysql/wordpress/ COPY ./wordpress /var/lib/mysql/wordpress/ RUN chown -R mysql:mysql /var/lib/mysql/wordpress #mariadbの起動 CMD ["/usr/bin/mysqld_safe" ,"--skip-grant-tables"] ----------------------------------------- 11.dbのイメージを作成する際に必要なファイルを作成 # mkdir /opt/project/db/wordpress && vi /opt/project/db/wordpress/db.opt /opt/project/db/wordpress/db.opt ----------------------------------------- default-character-set=latin1 default-collation=latin1_swedish_ci ----------------------------------------- 12.docker-composeでイメージをビルド # cd /opt/prject # docker-compose build 13.作成したイメージの確認 #docker images 14.docker-composeでコンテナを作成 # docker-compose up -d 15.作成したコンテナの確認 # docker ps # docker-compose ps 16.WEBでログインしてwordpressをインストール http://グローバルIP ~データベースの選択画面~ データベース名: wordpress ユーザ名:  空白   パスワード:   空白   データベースのホスト名:db ※データベースのコンテナ名 テーブルの接頭辞:wp_    (そのまま) でインストール!! 次の課題の確認のため、何か一つ思いのたけを投稿しておく。。。 参考 滅びの呪文 初心者はdocker-composeから始めた方がいいかもしれない説 Docker Compose を使う データの永続化 1.dockerボリュームを作成 # docker volume create mariadb 2.docker-compose.ymlにvolumesを追加 # cd /var/project/ && vi docker-compose.yml docker-compose.yml --------------------------------------------- version: "3.8" services: web: ~要約~ #ボリュームを使いWEBデータを永続化 volumes: - wordpress/:/var/www/html ~~~~~~~~~~~~~~~~~~~~~~~ db: ~要約~ #ボリュームを使いDBデータを永続化 volumes: - mariadb:/var/lib/mysql ~~~~~~~~~~~~~~~~~~~~~~~ # databaseのように永続的なストレージが欲しい場合に必要な設定 volumes: mariadb: wordpress: --------------------------------------------- 3.dockerコンテナを一度削除 # docker-compose down -v 4.docker-composeでコンテナを再作成 # docker-compose up -d 5.WEBでログインして確認 http://グローバルIP 参考② Docker-Compose persistent data MySQL Dockerのデータを永続化!Data Volume(データボリューム)の理解から始める環境構築入門 docker-compose を使って WordPress テーマ開発環境を構築しよう
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SAM CLI + DynamoDB Local 環境構築手順メモ

SAM CLIとDynamo DB Localを使用してローカル環境でサーバーレスアプリを構築する手順についてメモする。 前提条件 Docker、docker-composeインストール済みであること。 dynamodb-admin(DynamoDB GUIツール)インストール済みであること。インストール手順 SAM CLIインストール済みであること。 ディレクトリ構成 local_app - dynamodb -- docker-compose.yml | |_ docker - dynamodb |_ sam-app 構築手順 DynamoDB Local準備 docker-compose.yml準備 version: '3.8' services: dynamodb-local: command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data" image: "amazon/dynamodb-local:latest" container_name: dynamodb-local ports: - "8000:8000" volumes: - "./docker/dynamodb:/home/dynamodblocal/data" working_dir: /home/dynamodblocal networks: - lambda-local networks: lambda-local: external: true 2.Docker network 作成+コンテナ起動 docker network create lambda-local docker-compose up ※localhost:8000でコンテナが起動する。 3.dynamodb-admin(http://localhost:8001)にアクセス 4.テスト用テーブルtest-table作成 ※テーブル設定は下記の通り。 { "AttributeDefinitions": [ { "AttributeName": "name", "AttributeType": "S" }, { "AttributeName": "date", "AttributeType": "S" } ], "TableName": "test-table", "KeySchema": [ { "AttributeName": "name", "KeyType": "HASH" }, { "AttributeName": "date", "KeyType": "RANGE" } ], "TableStatus": "ACTIVE", "CreationDateTime": "2022-01-16T05:43:16.767Z", "ProvisionedThroughput": { "LastIncreaseDateTime": "1970-01-01T00:00:00.000Z", "LastDecreaseDateTime": "1970-01-01T00:00:00.000Z", "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 3, "WriteCapacityUnits": 3 }, "TableSizeBytes": 116, "ItemCount": 3, "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/test-table" } SAMプロジェクト準備 1.SAMプロジェクト作成 local_appディレクトリ内で次のコマンドを実行。 sam init --runtime python3.8 ※HelloworldFunction利用。その他もデフォルト設定で作成。 2.各種設定、コード変更 app.py DynamoDBテーブルtest-tableにname、dateを登録する。 import json import boto3 import string import random from datetime import datetime def lambda_handler(event, context): # DynamoDB接続設定 session = boto3.session.Session() region = session.region_name dynamodb = boto3.resource('dynamodb', region_name = region, endpoint_url = "http://dynamodb-local:8000") # テーブルを取得 table = dynamodb.Table('test-table') # name(文字数5の英数字文字列) dat = string.digits + string.ascii_lowercase + string.ascii_uppercase name = ''.join([random.choice(dat) for i in range(5)]) # 日時 date = datetime.utcnow().isoformat() # 登録アイテム item = {'name': name, 'date': date} # テーブル登録 table.put_item( Item=item ) return { "statusCode": 200, "body": json.dumps(item), } requirements.txt ※boto3追加 requests boto3 template.yml ※Pathを/item、Methodをpostに変更 ~省略~ Events: HelloWorld: Type: Api Properties: Path: /item Method: post 3.API起動 sam local start-api --docker-network lambda-local 動作確認 APIリクエスト POST /item HTTP/1.1 Host: localhost:3000 Content-Type: application/json Content-Length: 2 {} APIレスポンス { "name": "d4jlG", "date": "2022-01-16T06:00:45.853215" } dynamodb-adminからテーブル内容確認
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LambdaChip を Windows で試す

Docker インストールして動かすまでです dockerをPCにインストール インストール時に、WSL 2 installation is incomplete というエラーが表示されるので、Restartを選ばす、そこに表示されるURLをクリック https://aka.ms/wsl2kernel これを無視するとdocker自体はインストール完了しても Docker Engine failed to start...と表示されて失敗する。 手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ の順で更新プログラムもインストール Docker Engine starting... と表示されたら成功 LambdaChip Dockerインストール 上記LambdaChipのページ参照 Lacoコンパイラーのdockerイメージをダウンロード docker pull registry.gitlab.com/lambdachip/laco:latest ※dockerのImagesのNAMEに registry.gitlab.com/lamb... と表示されればダウンロード成功 dockerで上記をRUN lambdachip-workspaceというフォルダを作成 mkdir lambdachip-workspace cd lambdachip-workspace docker イメージにログイン docker run -it --rm -v %cd%:/workspace -w /workspace -u "lambdachip:lambdachip" registry.gitlab.com/lambdachip/laco:latest bash lambdachip@9e43fbe7cf38:/workspace$ ※@後の数字は毎回異なる。 上のようになればログインできている サンプルプログラムつくってみる サイト上のソースコードを使いprogram.scmというファイル名で保存 ***.txtのままだとダメなので、フォルダの表示で拡張子を変更できるようにしてから、メモ帳で作った後に名前の変更で拡張子を.txt→.scmに変更する。 program.scmをlambdachip-workspaceフォルダへ移動 lambdachipのwrokspaceにログインした状態でlaco program.scmのコマンドを実行 laco program.scm できたprogram.lefをMicroSDカードへ保存 LambdaChipにMicroSDを挿入し、Type-CケーブルでLambdaChipに電源供給するとプログラム(先程のlefファイル)が自動で実行されてLEDが点滅します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LambdaChip を MS-Windows で試す

Docker インストールして動かすまでです dockerをPCにインストール インストール時に、WSL 2 installation is incomplete というエラーが表示されるので、Restartを選ばす、そこに表示されるURLをクリック https://aka.ms/wsl2kernel これを無視するとdocker自体はインストール完了しても Docker Engine failed to start...と表示されて失敗する。 手順 4 - Linux カーネル更新プログラム パッケージをダウンロードする x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ の順で更新プログラムもインストール Docker Engine starting... と表示されたら成功 LambdaChip Dockerインストール 上記LambdaChipのページ参照 Lacoコンパイラーのdockerイメージをダウンロード docker pull registry.gitlab.com/lambdachip/laco:latest ※dockerのImagesのNAMEに registry.gitlab.com/lamb... と表示されればダウンロード成功 dockerで上記をRUN lambdachip-workspaceというフォルダを作成 mkdir lambdachip-workspace cd lambdachip-workspace docker イメージにログイン docker run -it --rm -v %cd%:/workspace -w /workspace -u "lambdachip:lambdachip" registry.gitlab.com/lambdachip/laco:latest bash lambdachip@9e43fbe7cf38:/workspace$ ※@後の数字は毎回異なる。 上のようになればログインできている サンプルプログラムつくってみる サイト上のソースコードを使いprogram.scmというファイル名で保存 ***.txtのままだとダメなので、フォルダの表示で拡張子を変更できるようにしてから、メモ帳で作った後に名前の変更で拡張子を.txt→.scmに変更する。 program.scmをlambdachip-workspaceフォルダへ移動 lambdachipのwrokspaceにログインした状態でlaco program.scmのコマンドを実行 laco program.scm program.lef ファイルが実行ファイルです Alonzo ボードで実行 手元に Alonzo ボードがある方は、program.lef を MicroSDカードへコピーします。 LambdaChipにMicroSDを挿入し、Type-CケーブルでLambdaChipに電源供給するとプログラム(先程のlefファイル)が自動で実行されてLEDが点滅します。 手元に Alonzo ボードが無い方は、ワークショップ主催者が用意したリモート Alonzo ボードを使ってみます。 scp program.lef (ログオンユーザ名)@(リモートAlonzoボードアドレス):/home/(ログオンユーザ名)/(ワークショップユーザ名).lef で転送しましょう。 主催者が ログオンユーザ名とリモートAlonzoボードアドレスを用意します。 例えば、リモートAlonzoボードアドレスが 123.456.789.012 、ログオンユーザ名が lambda とします。 あなたのワークショップユーザ名が taro とすると、 scp program.lef lambda@123.456.789.012:/home/lambda/taro.lef とすると、リモートAlonzo ボードに転送されます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

youtube動画 【AWS 入門】EC2とDockerでHello Worldしよう の手順メモ

概要 youtubeの【AWS 入門】EC2とDockerでHello Worldしようの(EC2起動後の)手順をこちらにメモしておく。 上の動画の手順通りにやれば、ブラウザからEC2のIPアドレスにアクセスして、Hello World docker !!の文字を表示することができました。 EC2起動後の手順 1 sudo yum update 2 sudo yum install docker 3 sudo service docker start 4 sudo docker info 5 mkdir hello-docker 6 cd hello-docker/ 7 vi hello.html 8 vi Dockerfile 9 sudo docker build -t hello-docker-ec2 . 10 sudo docker run --rm -d -p 80:80 hello-docker-ec2 11 sudo docker ps 7. vi hello.html で作成するhtmlファイル hello.html Hello from docker !! 8. vi Dockerfileで作成するDockerfile FROM nginx COPY ./hello.html /usr/share/nginx/html/ 10. sudo docker run --rm -d -p 80:80 hello-docker-ec2 --rm コンテナ停止後にコンテナを削除するというオプション - d バックグラウンドで起動させるというオプション。 -p 80:80 どのportを使うかを指定する設定。 セキュリティグループの設定時にport80番でのアクセスのみを許可するように設定した。そのため、このオプションを付ける必要がある。 コンテナの停止方法 docker ps コマンドで出力される、CONTAINER ID を使用して以下のコマンドを打つ。 docker stop 英数字(CONTAINER ID) 例 docker stop 728afd82290e docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 728afd82290e hello-docker-ec2 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:30->30/tcp, :::30->30/tcp, 80/tcp silly_goldstine
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DynamoDB Local環境構築手順 メモ

DynamoDB Localの環境構築手順についてメモする。 DynamoDB Localとは AWS製のローカル環境向けDynamoDB Dockerイメージとして提供 前提条件 Docker,docker-compose環境構築済みであること。 nodejsインストール済みであること。 ディレクトリ構成 dynamo_test -- docker-compose.yml |_ docker/dynamodb 環境構築手順 1.docker-compose.yml準備 version: '3.8' services: dynamodb-local: command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data" image: "amazon/dynamodb-local:latest" container_name: dynamodb-local ports: - "8000:8000" volumes: - "./docker/dynamodb:/home/dynamodblocal/data" working_dir: /home/dynamodblocal 2.マウントディレクトリ作成+権限設定 ※コンテナ内部でdynamodblocalユーザーとして処理するために必要 mkdir -p ./docker/dynamodb sudo chmod 777 ./docker/dynamodb 3.コンテナ起動 docker-compose up Starting dynamodb-local ... done Attaching to dynamodb-local dynamodb-local | Initializing DynamoDB Local with the following configuration: dynamodb-local | Port: 8000 dynamodb-local | InMemory: false dynamodb-local | DbPath: ./data dynamodb-local | SharedDb: true dynamodb-local | shouldDelayTransientStatuses: false dynamodb-local | CorsParams: * dynamodb-local | ※localhost:8000でコンテナが起動する。 動作確認 0.dynamodb-admin(DynamoDB用GUIツール) . 次のコマンドを実行する。 npm install -g dynamodb-admin set DYNAMO_ENDPOINT=http://localhost:8000 ※筆者環境はWindowsのため、上記接続先設定を行っている。 1.dynamodb-admin起動 dynamodb-admin 2.http://localhost:8001にアクセス 3.テーブル作成 Create Tableボタンを押下し、テーブル情報を入力してテーブルを作成する。 参考情報 DynamoDB ローカル (ダウンロード可能バージョン) のセットアップ aaronshaf/dynamodb-admin DynamoDBの初心者に伝えたい初めて触るときの勘所
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECCUBEをdockerで動かす

ECCUBEを触りたくてdocker環境で動かすことにしました。 所々一筋縄ではいかなかったのでまとめました。 1.gitから落とす リポジトリURLからブランチ(tags)を確認して、実行するバージョンをローカルに落とす。 ECCUBEリポジトリのURL https://github.com/EC-CUBE/ec-cube.git ブランチの指定方法 git clone -b ブランチ名 https://リポジトリのURL (例)4.0.5の環境を利用する場合のコマンド git clone -b 4.0.5 https://github.com/EC-CUBE/ec-cube.git 2.docker-compose.ymlを修正する ・MySQLを利用したいので、Postgresをコメントアウト ・SSL利用しないのでコメントアウト ・動作が重くなるのでcachedをコメントアウト ・phpmyadminを利用するので追記 docker-compose.ymlサンプルファイル version: "3" networks: backend: driver: bridge volumes: # pg-database: # driver: local mysql-database: driver: local mailcatcher-data: driver: local ### ignore folder volume ##### var: driver: local vendor: driver: local services: ### ECCube4 ################################## ec-cube: build: context: . args: # ビルド時のECCubeインストールスクリプトをスキップする場合にtrueを指定する。 # ビルド時点でDBサーバの起動や接続が出来ない、という場合等にエラーとなるため。 SKIP_INSTALL_SCRIPT_ON_DOCKER_BUILD: "true" ports: - 8080:80 # - 4430:443 volumes: # - ".:/var/www/html:cached" ### 同期対象からコストの重いフォルダを除外 ##################### - "var:/var/www/html/var" - "vendor:/var/www/html/vendor" networks: - backend ### Postgres ################################ # postgres: # image: postgres:10 # environment: # - POSTGRES_DB=eccubedb # - POSTGRES_USER=dbuser # - POSTGRES_PASSWORD=secret # ports: # - 15432:5432 # volumes: # - pg-database:/var/lib/postgresql/data # networks: # - backend ### MySQL ################################## mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: eccubedb MYSQL_USER: dbuser MYSQL_PASSWORD: secret volumes: - mysql-database:/var/lib/mysql ports: - 13306:3306 networks: - backend restart: always ### phpmyadmin ################################## phpmyadmin: image: phpmyadmin/phpmyadmin links: - mysql:mysql volumes: - ./phpmyadmin/sessions:/sessions ports: - 4040:80 environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root restart: always depends_on: - mysql networks: - backend ### Mailcatcher ################################## mailcatcher: image: schickling/mailcatcher ports: - "1080:1080" - "1025:1025" networks: - backend 3.Dockerfileを修正する ・composerを最新にすると動かなくなるのでバージョンを指定する。 Dockerfileの抜粋 RUN curl -sS https://getcomposer.org/installer \ | php \ && mv composer.phar /usr/bin/composer \ && composer selfupdate --1 \ && composer config -g repos.packagist composer https://packagist.jp \ && composer global require hirak/prestissimo \ && chown www-data:www-data /var/www \ && mkdir -p \${APACHE_DOCUMENT_ROOT}/var \ && chown -R www-data:www-data \${APACHE_DOCUMENT_ROOT} \ && find ${APACHE_DOCUMENT_ROOT} -type d -print0 \ | xargs -0 chmod g+s \ ; 4.docker-composeコマンドの実行 コンテナの作成と開始 docker-compose up -d ECCUBEのインストール docker-compose exec -u www-data ec-cube bin/console eccube:install DBの設定 ※MySQLの場合以下を入力する。 Database Url [sqlite:///var/eccube.db]: mysql://dbuser:secret@mysql/eccubedb 以降Enter押下で完了 Mailer Url [null://localhost]: (Enter押下) Auth Magic [ランダム値]: (Enter押下) Is it OK? (yes/no) [yes]: (Enter押下) 6.サイトへアクセスする メインページ http://localhost:8080/ 管理者ページ[ID_admin][pass_password] http://localhost:8080/admin 『設定→システム設定→システム情報』で想定のバージョンがインストールされていることを確認する。 phpMyAdmin http://localhost:4040/ phpMyAdminも問題なく表示される。 ECCUBEをローカルで触れるようになりました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Azure DevOps のセルフホステッド Linux エージェントを Docker で起動してその中で Docker ビルドしてみた

背景と目的 以前こちらの記事を書きました。今回はセルフホステッド Linux エージェントを Docker で起動して、その Docker の中で Docker ビルドが出来る環境を用意して試してみました。 前提条件 コマンドの実施環境は、Mac + Azure CLI です。 bash $ sw_vers ProductName: macOS ProductVersion: 12.1 BuildVersion: 21C52 $ az version { "azure-cli": "2.32.0", "azure-cli-core": "2.32.0", "azure-cli-telemetry": "1.0.6", "extensions": {} } Azure DevOps 組織にプロジェクトを作成 bash # リソースのリージョンを設定します region=japaneast # Azure DevOps 組織名を設定します(サインアップした組織名です) prefix=mnrdevopsagent # Azure CLI に拡張機能を追加します az extension add \ --name azure-devops # 拡張機能に Azure DevOps 組織をデフォルト設定します az devops configure \ --defaults organization=https://dev.azure.com/${prefix}/ # Azure DevOps のプロジェクトを作成します az devops project create \ --name ${prefix} # 作成したプロジェクトに簡単な Dockerfile を登録します mkdir ${prefix} && cd ${prefix} echo "FROM nginx" > Dockerfile git init git add Dockerfile git commit -m "first commit" git remote add origin https://${prefix}@dev.azure.com/${prefix}/${prefix}/_git/${prefix} git push -u origin --all プロジェクトに Azure Pipeline を作成 こちらを参考にパイプラインを作成します。 bash # azure-pipelines.yml を作成 cat <<EOF > azure-pipelines.yml trigger: - master pool: vmImage: ubuntu-latest variables: imageName: ${prefix} steps: - task: Docker@2 displayName: Build an image inputs: repository: \$(imageName) command: build Dockerfile: Dockerfile EOF # azure-pipelines.yml を Git リポジトリに登録します git add azure-pipelines.yml git commit -m update git push # パイプラインを作成します az pipelines create \ --name ${prefix}-pipeline \ --yml-path azure-pipelines.yml # パイプラインの実行状況を確認します az pipelines runs list \ --output table # 最初のパイプラインの詳細を確認します az pipelines runs show \ --id 1 \ --output table # ブラウザーでビルド結果ページを開きます az pipelines runs show \ --id 1 \ --open セルフホステッド検証用の Linux VM を作成 bash # リソースグループを作成します az group create \ --name ${prefix}-rg \ --location $region # SSH キーペアをファイル名を指定して作成します ssh-keygen -m PEM -t rsa -b 4096 \ -f ${prefix} # VM を作成します az vm create \ --resource-group ${prefix}-rg \ --name ${prefix}-vm \ --os-disk-name ${prefix}-vmOSDisk \ --image UbuntuLTS \ --admin-username azureuser \ --ssh-key-value ${prefix}.pub \ --size Standard_A2_v2 \ --nsg-rule NONE \ --public-ip-address-dns-name ${prefix} \ --storage-sku Standard_LRS # NSG に自分の IP アドレスから SSH 接続出来るようにします az network nsg rule create \ --resource-group ${prefix}-rg \ --name Allow-SSH \ --nsg-name ${prefix}-vmNSG \ --priority 100 \ --source-address-prefixes $(curl -s inet-ip.info) \ --destination-port-ranges 22 \ --access Allow \ --protocol Tcp # SSH 秘密キーを使用して SSH 接続します ssh -i ${prefix} azureuser@${prefix}.$region.cloudapp.azure.com VM 内で Docker 環境を準備 bash sudo apt-get install ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get -y install docker-ce docker-ce-cli containerd.io sudo usermod -a -G docker $USER newgrp docker docker run -it --rm nginx curl inet-ip.info セルフホステッド Linux エージェントを Docker で起動 bash # Azure DevOps の組織 URL を設定(${prefix} 部分は手動で置き換えてください) azpurl=https://dev.azure.com/${prefix} azptoke=arwttgjnbnbssyn3gtdqau6a6g6sgx52pufczx4nmxrfvw2tmj5a # セルフホステッドエージェント用の PAT を設定します azptoke=yourpathere # セルフホステッド Linux エージェント用の Dockerfile を作成します cat << "EOF" > Dockerfile FROM ubuntu:18.04 # To make it easier for build and release pipelines to run apt-get, # configure apt to not require confirmation (assume the -y argument by default) ENV DEBIAN_FRONTEND=noninteractive RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ jq \ git \ iputils-ping \ libcurl4 \ libicu60 \ libunwind8 \ netcat \ libssl1.0 \ && rm -rf /var/lib/apt/lists/* RUN curl -LsS https://aka.ms/InstallAzureCLIDeb | bash \ && rm -rf /var/lib/apt/lists/* ENV DOCKER_CHANNEL stable ENV DOCKER_VERSION 18.06.1-ce RUN set -ex \ && curl -fL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/`uname -m`/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \ && tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin \ && rm docker.tgz \ && docker -v ARG TARGETARCH=amd64 ARG AGENT_VERSION=2.194.0 WORKDIR /azp RUN if [ "$TARGETARCH" = "amd64" ]; then \ AZP_AGENTPACKAGE_URL=https://vstsagentpackage.azureedge.net/agent/${AGENT_VERSION}/vsts-agent-linux-x64-${AGENT_VERSION}.tar.gz; \ else \ AZP_AGENTPACKAGE_URL=https://vstsagentpackage.azureedge.net/agent/${AGENT_VERSION}/vsts-agent-linux-${TARGETARCH}-${AGENT_VERSION}.tar.gz; \ fi; \ curl -LsS "$AZP_AGENTPACKAGE_URL" | tar -xz COPY ./start.sh . RUN chmod +x start.sh ENTRYPOINT [ "./start.sh" ] EOF # Dockerfile の一番最後で呼ばれるシェルスクリプトを作成します cat << "EOF" > start.sh #!/bin/bash set -e if [ -z "$AZP_URL" ]; then echo 1>&2 "error: missing AZP_URL environment variable" exit 1 fi if [ -z "$AZP_TOKEN_FILE" ]; then if [ -z "$AZP_TOKEN" ]; then echo 1>&2 "error: missing AZP_TOKEN environment variable" exit 1 fi AZP_TOKEN_FILE=/azp/.token echo -n $AZP_TOKEN > "$AZP_TOKEN_FILE" fi unset AZP_TOKEN if [ -n "$AZP_WORK" ]; then mkdir -p "$AZP_WORK" fi export AGENT_ALLOW_RUNASROOT="1" cleanup() { if [ -e config.sh ]; then print_header "Cleanup. Removing Azure Pipelines agent..." # If the agent has some running jobs, the configuration removal process will fail. # So, give it some time to finish the job. while true; do ./config.sh remove --unattended --auth PAT --token $(cat "$AZP_TOKEN_FILE") && break echo "Retrying in 30 seconds..." sleep 30 done fi } print_header() { lightcyan='\033[1;36m' nocolor='\033[0m' echo -e "${lightcyan}$1${nocolor}" } # Let the agent ignore the token env variables export VSO_AGENT_IGNORE=AZP_TOKEN,AZP_TOKEN_FILE source ./env.sh print_header "1. Configuring Azure Pipelines agent..." ./config.sh --unattended \ --agent "${AZP_AGENT_NAME:-$(hostname)}" \ --url "$AZP_URL" \ --auth PAT \ --token $(cat "$AZP_TOKEN_FILE") \ --pool "${AZP_POOL:-Default}" \ --work "${AZP_WORK:-_work}" \ --replace \ --acceptTeeEula & wait $! print_header "2. Running Azure Pipelines agent..." trap 'cleanup; exit 0' EXIT trap 'cleanup; exit 130' INT trap 'cleanup; exit 143' TERM # To be aware of TERM and INT signals call run.sh # Running it with the --once flag at the end will shut down the agent after the build is executed ./run.sh "$@" & wait $! EOF # コンテナイメージを作成します docker build -t devopsagent:latest . # セルフホステッドエージェントを起動します docker run -d \ -e AZP_URL=$azpurl \ -e AZP_TOKEN=$azptoke \ -e AZP_AGENT_NAME=$(hostname)-devopsagent \ --name $(hostname)-devopsagent \ -v /var/run/docker.sock:/var/run/docker.sock \ devopsagent:latest # エージェントのログを確認します docker logs -f $(hostname)-devopsagent 作成したセルフホステッドエージェントでパイプラインを実行 bash # VM からログアウトします exit # azure-pipelines.yml を更新 cat <<EOF > azure-pipelines.yml trigger: - master pool: default variables: imageName: ${prefix} steps: - task: Docker@2 displayName: Build an image inputs: repository: \$(imageName) command: build Dockerfile: Dockerfile EOF # azure-pipelines.yml を Git リポジトリに登録します git add azure-pipelines.yml git commit -m update git push # パイプラインの実行状況を確認します az pipelines runs list \ --output table # 最初のパイプラインの詳細を確認します az pipelines runs show \ --id 2 \ --output table # ブラウザーでビルド結果ページを開きます az pipelines runs show \ --id 2 \ --open 参考 bash # リソースグループを削除します az group delete \ --name ${prefix}-rg # Azure DevOps のプロジェクトを削除します az devops project delete \ --id $(az devops project show \ --project ${prefix} \ --query id \ --output tsv) # Azure CLI に追加した拡張機能を削除します az extension remove \ --name azure-devops
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js on Dockerでエラー発生(Error: EACCES: permission denied, errno: -13)

はじめに DockerでNext.jsを使ってウェブページを作ろうとしたけど、npx create-next-app {name}の段階でglob errorっていうワケワカランのが発生した。テンションが下がった。 環境 Linux (KDE neon based on Ubuntu) Docker version 20.10.12 image node:17.3-alpine 問題 # コマンドをうちこむ docker-compose run --rm node npx create-next-app nextjs-tutorial Creating nextjs-tutorial_node_run ... done Creating a new Next.js app in /usr/src/app/nextjs-tutorial. Using npm. Installing dependencies: - react - react-dom - next #エラー❗❗❗なにこれ。 glob error [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] { errno: -13, code: 'EACCES', syscall: 'scandir', path: '/root/.npm/_logs' } とりあえず権限が無いということはわかった。permission deniedとか出たときは大方ファイル権限かユーザー管理あたりが原因。 原因 DockerFileにUSER nodeの指定がないことが原因だった。これが何を意味するんだろうか? コマンドをrootで実行しなくなるということだから、とりあえずセキュリティリスクが低下することはなんとなくわかる。 とりあえず、参考したページでUSER nodeの指定をしろと書いてあったのでそうする。 解決策 DockerFileにUSERの指定を追記したら解決するらしい。 DockerFile FROM node:17.3-alpine WORKDIR /usr/src/app USER node こうすると、このイメージで作成されたコンテナは実行ユーザーがnodeになる。 あるいは、WORKDIRを/home/にしたらいいっぽい。 DockerFile FROM node:17.3-alpine WORKDIR /home/node/app やっぱりrootが絡むとよくないんだろうか。 理屈はわからんけどとりあえずヨシ! おわりに 理屈はまだ理解してないけれど、とりあえずこれを書いてるのが深夜3時過ぎで、このあと午前10時から予定があるので、理解は後回しにしようと思います。 誰かわかるよって人いたら教えてほしいです。よろしくおねがいします。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker(WSL2)でPleasanter(SQLServer)環境を作成

環境 ・OS : Windows11 pro ・WSL2 : Ubuntu 20.04.3 LTS ・Docker: version 20.10.12, build e91ed57 動機 Pleasnterを自分の備忘録として使えないかと思い、Dockerで環境を作りました 作り方 以下のDockerfileを使って Dockerfile.pleasanter-dotnet-sqlserver # # pleasanter -dotnet - sqlserver # FROM mcr.microsoft.com/mssql/server ENV ACCEPT_EULA=Y ENV MSSQL_PID=Express ENV SA_PASSWORD=Password1! USER root RUN apt-get update && apt-get install -y curl RUN curl https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list | tee /etc/apt/sources.list.d/mssql-server.list RUN apt-get update && \ apt-get install -y \ unzip \ dotnet-sdk-5.0 \ mssql-server-fts RUN wget https://github.com/Implem/Implem.Pleasanter.NetCore/releases/download/Pleasanter_1.2.24.1/Pleasanter_1.2.24.1.zip RUN unzip Pleasanter_1.2.24.1.zip WORKDIR /pleasanter/Implem.Pleasanter RUN sed -i -e 's/PostgreSQL/SQLServer/g' App_Data/Parameters/Rds.json RUN sed -i -e 's/Database=postgres/Database=master/g' App_Data/Parameters/Rds.json RUN sed -i -e 's/UID=postgres/UID=sa/g' App_Data/Parameters/Rds.json RUN sed -i -e 's/SetSaPWD/'${SA_PASSWORD}'/g' App_Data/Parameters/Rds.json WORKDIR /pleasanter CMD ["/opt/mssql/bin/sqlservr"] この下のコマンドを、上から順に実行します docker build -t pleasanter-dotnet-sqlserver -f Dockerfile.pleasanter-dotnet-sqlserver . docker run --name pleasanter-dotnet-sqlserver -p 5000:5000 -d pleasanter-dotnet-sqlserver docker restart pleasanter-dotnet-sqlserver docker exec pleasanter-dotnet-sqlserver dotnet /pleasanter/Implem.CodeDefiner/Implem.CodeDefiner.NetCore.dll _rds docker exec -w /pleasanter/Implem.Pleasanter pleasanter-dotnet-sqlserver dotnet /pleasanter/Implem.Pleasanter/Implem.Pleasanter.NetCore.dll --urls=http://0.0.0.0:5000 これでhttp://localhost:5000/ にアクセスすればPleasanterのログイン画面が表示されます はまったところ 最初Githubのソースコードからbuildをしようとしましたが、ソースコードからbuildしてhttp://localhost:5000/ にアクセスすると真っ白な画面が表示されその先に進めませんでした ブラウザの開発者ツールで原因を探ったところ、htmlでvisibility:hiddenとなっている箇所があり、それが原因ではないかと思いましたがそれ以上はわかりませんでした...(これを開発者ツールで修正しても結局その先に進めませんでした) そのためDockerfileに書いてあるように、https://github.com/Implem/Implem.Pleasanter.NetCore/releases のzipファイルをダウンロードして実行したところうまくいきました(なぜzipから実行するとうまくいくのかはわかりません) 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL,Docker】MySQLの文字化けを解消する方法

概要 本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。 今回はMySQLの文字化けを解消する方法について調べたことをまとめます。 環境 Docker Laravel Sail MySQL8.0 今回起きた現象 boardsテーブルの2行目のtitleは、本来「こんにちは」と入力されていますが、「?????」と文字化けしています。 mysql> select * from boards; +----+-----------+--------------+---------+---------------------+---------------------+ | id | person_id | title | message | created_at | updated_at | +----+-----------+--------------+---------+---------------------+---------------------+ | 1 | 1 | Hello | xxxxxxx | 2022-01-11 07:32:54 | 2022-01-11 07:32:54 | | 2 | 2 | ????? | yyyyy | 2022-01-11 07:33:24 | 2022-01-11 07:33:24 | | 3 | 1 | good_morning | xxxxxx | 2022-01-11 09:32:31 | 2022-01-11 09:32:31 | +----+-----------+--------------+---------+---------------------+---------------------+ 原因 文字セットがどのように設定されているかを確認したところ以下のような状態でした。 mysql> show variables like "chara%"; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec) 結果としては、 character_set_client character_set_connection character_set_results の3項目でlatin1が設定されています。 これらをutf8mb4に変更する必要があるようです。 character_set_client・・・サーバーは、character_set_client システム変数値を、クライアントが送信するステートメントの文字セットにします。 character_set_connection・・・クライアントによって送信されたステートメントを character_set_client から character_set_connection に変換します。 character_set_results・・・サーバーがクライアントにクエリー結果を返信するときに使用する文字セットを示します。 MySQL 8.0 リファレンスマニュアル 修正方法 まずはmysqlのコンテナに入り、複数ある設定ファイルmy.cnfの読み込み順序を調べます。 MySQL 8.0 リファレンスマニュアル $ docker exec -it [MySQLのコンテナ名] /bin/bash ///mysqlのコンテナに入る bash-4.4# mysql --help Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 今回コンテナ内にはデフォルトで/etc/my.cnf以外のファイルは存在しなかったので、ここを変更していきます。 /etc/my.cnf [mysqld] #コメントは省略 skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql pid-file=/var/run/mysqld/mysqld.pid 今回はDockerを用いて環境構築しているので、以下の順序で修正していきます。 1. /mysql/etc/my.cnfファイルをローカルに作成 2. mysqlコンテナ内の/etc/my.cnfの内容を1.のファイルにコピー 3. ローカルの/mysql/etc/my.cnfに設定を追記 4. docker-compose.ymlを修正 1. /etc/my.cnfファイルをローカルに作成 プロジェクトルート直下にmysqlディレクトリを作成、その配下にetc/my.cnfを作成する。 2. mysqlコンテナ内の/etc/my.cnfの内容を1.のファイルにコピー 今回は、デフォルトの状態は崩さず文字化けを直したいので、先ほど確認した/etc/my.cnfの内容をローカルの/mysql/etc/my.cnfにコピーします。 3. ローカルの/mysql/etc/my.cnfに設定を追記 MySQLのリファレンスには以下のように記載があります。 ここでいうオプションファイルは、my.cnfのことです。したがって、/mysql/etc/my.cnfにdefault-character-setに関する設定を追記します。 mysql クライアントでは、デフォルトとは異なる文字セットを使用するために、サーバーに接続するたびに SET NAMES ステートメントを明示的に実行できます (クライアントプログラム接続文字セット構成 を参照)。 同じ結果をより簡単に得るには、オプションファイルに文字セットを指定します。 たとえば、次のオプションファイル設定では、mysql を起動するたびに、接続関連の 3 つの文字セットシステム変数が koi8r に設定されます: MySQL 8.0 リファレンスマニュアル /mysql/etc/my.cnf [client] default-character-set=utf8mb4 #clientセクションを追加 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql pid-file=/var/run/mysqld/mysqld.pid 4. docker-compose.ymlを修正 ローカルの/mysql/etc/my.cnfをmysqlコンテナの/etc/my.cnfにマウントします。 これで、ローカルのmy.cnfに加えた変更がmysqlコンテナのmy.cnfにも反映されます。 docker-compose.yml #mysqlに関する部分のみ抜粋 mysql: image: 'mysql/mysql-server:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: "%" MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sailmysql:/var/lib/mysql' - './mysql/etc/my.cnf:/etc/my.cnf' # 追記 networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s コンテナを停止・再作成する docker-compose.ymlの変更を反映するために、コンテナを停止・再作成します。 もしサービス用のコンテナが存在している場合、かつ、コンテナを作成後にサービスの設定やイメージを変更している場合は、 docker-compose up -d を実行すると、 設定を反映するためにコンテナを停止・再作成します(マウントしているボリュームは、そのまま保持します)。 Docker-docs-ja fkjtmy@mba laravel-practice % docker compose up -d [+] Running 6/6 ⠿ Container laravel-practice_mailhog_1 Running 0.0s ⠿ Container laravel-practice_selenium_1 Running 0.0s ⠿ Container laravel-practice_meilisearch_1 Running 0.0s ⠿ Container laravel-practice_mysql_1 Running 0.0s ⠿ Container laravel-practice_redis_1 Running 0.0s ⠿ Container laravel-practice-laravel.test_1 Running 0.0s 設定が反映されたか確認する mysqlのコンテナに入り、ローカルでの修正内容が反映されているかを確認します。 $ docker exec -it [MySQLのコンテナ名] /bin/bash ///mysqlのコンテナに入る bash-4.4# cat /etc/my.cnf [client] default-character-set=utf8mb4 #clientセクションを追加 [mysqld] skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql pid-file=/var/run/mysqld/mysqld.pid 反映された!! 次はmysqlに接続し、文字セットとテーブルを確認します。 mysqlの文字セットとテーブルの確認 mysql> show variables like "chara%"; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec) mysql> select * from boards; +----+-----------+-----------------+---------+---------------------+---------------------+ | id | person_id | title | message | created_at | updated_at | +----+-----------+-----------------+---------+---------------------+---------------------+ | 1 | 1 | Hello | xxxxxxx | 2022-01-11 07:32:54 | 2022-01-11 07:32:54 | | 2 | 2 | こんにちは | yyyyy | 2022-01-11 07:33:24 | 2022-01-11 07:33:24 | | 3 | 1 | good_morning | xxxxxx | 2022-01-11 09:32:31 | 2022-01-11 09:32:31 | +----+-----------+-----------------+---------+---------------------+---------------------+ 3 rows in set (0.01 sec) 解決!! character_set_client character_set_connection character_set_results の3項目がutf8mb4に変更されています。 また、テーブル2行目のtitleが「こんにちは」とひらがなで正常に表示されています。 まとめ mysqlで文字化けが起こった際は、 1. /mysql/etc/my.cnfファイルをローカルに作成 2. mysqlコンテナ内の/etc/my.cnfの内容を1.のファイルにコピー 3. ローカルの/mysql/etc/my.cnfに設定を追記 4. docker-compose.ymlを修正 の手順で修正できます。 my.cnfを作成する場所などは開発環境に合わせて適宜変更しても問題ありません。 参考文献 MySQL 8.0 リファレンスマニュアル 10.4 接続文字セットおよび照合順序 4.2.2.2 オプションファイルの使用 Docker-docs-ja
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む