- 投稿日:2020-09-10T22:45:12+09:00
Dockerを使ったCICDパイプラインの構築(個人的備忘録)
Gitの設定
1.任意の名前でリポジトリの作成 2.publicの設定 3.「create repository」をクリック 4.ユーザー設定 -# アプリのディレクトリで行う % git config user.name ”ユーザー名” % git config user.email “githubの登録メール” -# 設定したユーザー名、emailが登録されていることを確認する。 % git config user.name % git config user.email 5.リモートリポジトリの紐付け % git remote add origin リポジトリのURL.git -# 紐付けの確認 % git remote -vリポジトリにpushする
% git add . % git commit -m ‘first commit’ % git push origin masterリポジトリにアプリがpushできているか確認する。
Travis CIに登録
1.右上のSign inをクリック 2.「SIGN IN WITH GITHUB」をクリック 3.「Authorize travis-ci」をクリック 4.Githubの情報を入力 5.左の「+」をクリックする 6.任意のリポジトリをクリックし同期させる 7.上部の「Dashbord」をクリックし、「Active repositories」に選んだリポジトリがあることを確認する。.travis.ymlの作成
-# アプリのホームディレクトリに作成する % vim .travis.yaml.travis.yaml# sudo権限で実行 sudo: required # dockerの使用宣言 services: docker # コンテナの起動 before_install: - docker-compose up --build -d script: # DBの準備 - docker-compose exec —env 'RAILS_ENV=test' web rails db:create - docker-compose exec —env 'RAILS_ENV=test' web rails db:migrate # テストの実行 - docker-compose exec —env 'RAILS_ENV=test' web rails test Travi CIを動かすにはgithubにコードをpushする必要がある。 docker-compose.ymlの記述 version: '3' # dockervolumeここにデータが保存される volumes: db-data: services: web: build: . ports: - '3000:3000' volumes: - '.:/product-register' # コンテナの環境変数設定、本来は直接パスワードを書いてはいけない。 environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true # dbサービスが作られたら作成される depends_on: - db # webからdbにアクセスできる links: - db # postgresのコンテナ db: image: postgres # ホストのdb-dataにデータを保管 volumes: - 'db-data:/var/lib/postgresql/data' environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=postgres' # localhost以外でpostgresを動かす場合に必要 - 'POSTGRES_HOST_AUTH_METHOD=trust'gitへpushする
% git add . % git commit -m ‘update travis and compose’ % git push origin masterここでtravisのページで実際に実行されている状況が確認できる。
Herokuの準備
1.ログインする 2.「create new app」をクリック 3.「APP name」に任意の名前をいれる。 4.「Create app」をクリック 5.作成されたら「Resources」をクリック。 6.「Add-ons」でpostgresで検索。「Heroku Postgres」を選択 7.「Provision」をクリック。 8.「Settings」をクリック、「Reveal Config Vars」をクリック。 9.config/master.keyの値をVALUEに入力する。 10.KEYの入力に「SECRET_KEY_BASE」と入力する。 11.「Add」をクリックする。 12.「Deploy」のタブをクリック。 13.「Deployment method」のGitHubをクリック 14.「Connect to GitHub」でリポジトリの名前を入力、「Search」をクリック 15.任意のリポジトリの「Connet」をクリック 16.「Automatic deploys」のWait for CI to pass before deploy(CIを通過してからデプロイ)にチェックする。 17.「Enable Automatic Deploy」をクリックdatabese.ymlの最下部をこのように設定する
config/databese.yml# You can use this database configuration with: # production: url: <%= ENV['DATABASE_URL'] %> # # production: # <<: *default # database: product-register_production # username: product-register # password: <%= ENV['PRODUCT-REGISTER_DATABASE_PASSWORD'] %>.travis.ymlの修正
.travis.yml# sudo権限で実行 sudo: required # dockerの使用宣言 services: docker # コンテナの起動 before_install: - docker-compose up --build -d # HerokuのDockerレジストリにログイン - docker login -u "$HEROKU_USERNAME" -p "$HEROKU_API_KEY" registry.heroku.com script: # DBの準備 - docker-compose exec --env 'RAILS_ENV=test' web rails db:create - docker-compose exec --env 'RAILS_ENV=test' web rails db:migrate # テストの実行 - docker-compose exec --env 'RAILS_ENV=test' web rails test deploy: provider: script script: docker build -t registry.heroku.com/$HEROKU_API_NAME/web -f Dockerfile.prod .; docker push registry.heroku.com/$HEROKU_API_NAME/web; heroku run --app $HEROKU_API_NAME rails db:migrate; on: branch: masterコメントアウトを入れると不具合が見られるので極力入れない方が良し。
Travis CIに環境変数を設定する
-# Heroku-cliをインストール % brew tap heroku/brew && brew install heroku -# Tokenの取得 % heroku authorizations:create1.Travis CIを開きリポジトリを開く。
2.「More options」の「Settings」をクリック
3.「Environment Variables」のNAMEに「HEROKU_USERNAME」、VALUEに「 _ 」を入力し、
「Add」をクリック。同じようにNAMEに「HEROKU_API_KEY」、VALUEには先ほどのTokenを入力、「Add」をクリック。また「HEROKU_API_NAME」にはherokuのリポジトリ名をいれる。Herokuに環境変数を設定する
1.Herokuを開き、任意のアプリをクリック
2.「Settings」タブをクリックし、「Reveal Config Vars」をクリック。
3.docker-compose.ymlに設定している、dbサービスのenvironmentの”DATABASE_PASSWORD=postgres”をKEYにDATABASE_PASSWORD、VALUEにpostgresとし「Add」をクリック。Dockerfile.prod(本番環境用)の作成
% vim Dockerfile.prodDockerfile.prodFROM ruby:2.5 RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ postgresql-client \ yarn WORKDIR /product-register COPY Gemfile Gemfile.lock /product-register/ RUN bundle install # カレントディレクトリのコードを全てコンテナに移す COPY . . # railsサーバの起動 CMD [ "rails", "s"] % git add . % git commit -m ’add deploy code’ % git push origin master実際の開発フロー
1.ブランチの作成 % git checkout -b hoge
2.作業を行う
3.変更したファイルをadd % git add .
4.変更をコミットする % git commit -m ’messege’
5.ブランチにpush % git push origin huge
(Travis CIが動く)
6.プルリクの作成
7.プルリクをmergeする(Travis CI完了後)
8.Travis CIが動く
9.Herokuにデプロイされる。
- 投稿日:2020-09-10T18:34:49+09:00
cygwin で docker のコンテナ内シェルを使う [docker exec -it bash]
cygwin で docker のコンテナ内シェルを使う
環境
- windows10
- cygwin
- Docker Desktop CE for Windows
概要
そのままでは動かなかったので忘備録として残すことに。
- 以下のように apt-cyg でエラーが出る場合は更新する
$ apt-cyg install gcc-g++ Cache directory is /packages Mirror is http://mirrors.kernel.org/sourceware/cygwin --2020-09-10 17:31:34-- https://cygwin.com/key/pubring.asc cygwin.com (cygwin.com) をDNSに問いあわせています... 8.43.85.97 cygwin.com (cygwin.com)|8.43.85.97|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 3049 (3.0K) [text/plain] `/tmp/tmp.2B5Pa48nYk' に保存中 /tmp/tmp.2B5Pa48nYk 100%[=============================================================================================================>] 2.98K --.-KB/s 時間 0s 2020-09-10 17:31:35 (12.5 MB/s) - `/tmp/tmp.2B5Pa48nYk' へ保存完了 [3049/3049] TRUSTEDKEY_CYGWIN: FAILED: Hash does not match https://cygwin.com/key/pubring.asc. Error: TRUSTEDKEY_CYGWIN has been updated, maybe. But sometimes it may has been cracked. Be careful !!! at : /usr/local/bin/apt-cyg: fetch_trustedkeys: 745
- winpty が入っていない場合は winpty のインストールをする
$ docker exec -it busy_williamson bash the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'apt-cyg の更新
- apt-cyg を download
$ cd /usr/local/bin $ wget https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg --2020-09-10 17:39:36-- https://raw.githubusercontent.com/kou1okada/apt-cyg/master/apt-cyg raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.108.133 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.108.133|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 68542 (67K) [text/plain] `apt-cyg.1' に保存中 apt-cyg.1 100%[=============================================================================================================>] 66.94K --.-KB/s 時間 0.03s 2020-09-10 17:39:48 (2.40 MB/s) - `apt-cyg.1' へ保存完了 [68542/68542]
- apt-cyg の入れ替え
rm apt-cyg mv apt-cyg.1 apt-cyg chmod +x apt-cyg
winpty のインストール
- gcc-g++, mingw64-x86_64-gcc-g++ のインストール
$ apt-cyg install gcc-g++ $ apt-cyg install mingw64-x86_64-gcc-g++
- winpty のインストール
$ mkdir winpty (ダウンロードするディレクトリ、適宜用意してください) $ cd winpty $ wget https://github.com/rprichard/winpty/archive/master.zip $ unzip master.zip $ cd winpty-master/ $ ./configure $ make $ make installdocker exec -it bash
- コンテナコンソール利用
winpty docker exec -it busy_williamson bash
以上、お疲れさまでした!
- 投稿日:2020-09-10T18:33:44+09:00
ちいさなDockerコンテナ
ちいさなDockerイメージ・コンテナのメモ
scratchの中身
以下を試して、scratchの中身は全くの空っぽであることを確かめた。
$ uname -sm Darwin x86_64 $ GOOS=linux GOARCH=arm64 go build -o hello hello.go $ cat > Dockerfile FROM scratch COPY hello /hello ENTRYPOINT ["/hello"] ^D $ docker image build -t test/hello . $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE test/hello latest b5590fa74374 2 hours ago 2.04MB $ docker run test/hello Hello, World $ docker image save -o out.tar test/hello $ ls -lhn out.tar -rw------- 1 501 20 2.0M 9 10 18:12 out.tar $ tar xvf out.tar x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/ x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/VERSION x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/json x 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/layer.tar x b5590fa74374835c813ed2c8490b2997581d3b815d306be739a2be67f6664792.json x manifest.json x repositories $ tar tvf 53d2a1a74edd0b6d3863682083df76fa417ebe730feecd84a55309fe407f7b0d/layer.tar -rwxr-xr-x 0 0 0 2038890 9 10 16:28 hellotar ballからちいさなコンテナを作る
コンテナだからchroot環境をtarに固めてimportすれば動くだろう。
$ mkdir chroot $ GOOS=linux GOARCH=arm64 go build -o chroot/hello hello.go $ ls -lRhn chroot total 4104 -rwxr-xr-x 1 501 20 2.0M 9 10 18:21 hello $ (cd chroot; tar cf ../image.tar .) $ ls -lhn image.tar -rw-r--r-- 1 501 20 2.0M 9 10 18:24 image.tar $ docker image import image.tar test/import $ docker image ls test/import REPOSITORY TAG IMAGE ID CREATED SIZE test/import latest bb6be6e60bb1 19 seconds ago 2.1MB $ docker run test/import /hello Hello, Worldうまく動いた
- 投稿日:2020-09-10T17:33:39+09:00
Ruby on Rails × DockerでRspecを導入
目標
- rails × docker 環境でrspecを導入したい
前提
- Docker on mac
- Ruby on Rails
手順
1.Gemfileにgemを追加する
以下のgemを:develop, :testに追加する
gem "rspec-rails"
gem "factory_bot_rails"Gemfilegroup :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] # テストフレームワーク gem "rspec-rails" gem "factory_bot_rails" end2.サーバーとは別のターミナルからrspecをインストールする
MacBook-Air アプリ名 % docker-compose run web rails g rspec:install Starting アプリ名_db_1 ... done Running via Spring preloader in process 64 create .rspec create spec create spec/spec_helper.rb create spec/rails_helper.rbこれで設定ファイルがディレクトリに作られる
さっそくテストを作成してみる
modelのspecを追加してみる
まずディレクトリを生成する。modelは自身がすでに生成したmodel.
MacBook-Air アプリ名 % docker-compose run web rails g rspec:model reception Starting アプリ名_db_1 ... done Running via Spring preloader in process 64 create spec/models/reception_spec.rb invoke factory_bot create spec/factories/receptions.rb生成できたら今回はバリデーションに関するテストを書く
spec/factories/reception.rbFactoryBot.define do factory :reception do name {"サンプル訪問者1"} purpose {"面談"} organization {"サンプル株式会社"} end endspec/models/reception_spec.rbRSpec.describe Reception, type: :model do reception = FactoryBot.create(:reception) it 'receptionインスタンスが有効' do expect(reception).to be_valid end endspecを追記したら、
MacBook-Air アプリ名 % docker-compose run web bundle exec rspecで実行完了
MacBook-Air アプリ名 % docker-compose run web bundle exec rspec Starting アプリ名_db_1 ... done . Finished in 0.22889 seconds (files took 6.32 seconds to load) 1 example, 0 failures参考文献
- 投稿日:2020-09-10T17:14:47+09:00
WSL2上のDockerでMySQLを構築する際のpermissionsの対策
前書き
WSL2 MySQLで検索してもなかなかpermissionの解決方法が見つからずにハマった人の為に記載する。(どいつもこいつもWindowsのDockerとリンクしやがって・・・GPU使わんのかい!)
環境
- Windows10 Insider Preview 2004(20206.1000)
- 4.19.128-microsoft-standard
- Ubuntu 20.04 LTS
現象
docker-compose up -d
でコンテナ起動をさせると以下のような感じでMySQLのコンテナが起動できない。root@pc-name: docker-compose logs mysql mysql_1 | mysqld: Cannot change permissions of the file 'private_key.pem' (OS errno 1 - Operation not permitted) mysql_1 | 2020-09-10T05:04:53.449233Z 0 [ERROR] [MY-010295] [Server] Could not set file permission for private_key.pem mysql_1 | 2020-09-10T05:04:53.449629Z 0 [ERROR] [MY-010119] [Server] Abortingこいつ(
permission
)の対応策について記載したい対応
/etc/wsl.conf
にマウントオプションを追加する。追加するマウントオプション[automount] options = "metadata"WSL2初めの方は基本存在しないと思うので以下の手順で対応する。
WSL2のディストリビューションに/etc/wsl.conf
を作成。# ルートでログイン user@pc-name:sudo -i # wslのディストリビューションにwslの設定ファイルを新規作成 root@pc-name: sudo touch /etc/wsl.conf # 設定ファイルを編集する。 root@pc-name: vi /etc/wsl.confマウントオプションを変更する。
i
でviコマンドをinsertモードにして以下を入力。[automount] options = "metadata"ESCを押下後、上書き保存(
:wq
)し、WSLを再起動。# ルートログアウト root@pc-name:exti # wsl ログアウト user@pc-name:exit # WSL シャットダウン wsl --shutdown # WSLを起動+ログイン wslこれで再度Docker関係でPermissionのエラーが消えていると思います。
おまけ
以下のようなログは/var/lib/mysqlのマウントディレクトリが既に存在する為
そのディレクトリを削除することで解決する。root@pc-name: docker-compose logs mysql ... mysql_1 | 2020-09-10T05:00:42.590708Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. mysql_1 | 2020-09-10T05:00:42.590714Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it. mysql_1 | 2020-09-10T05:00:42.590777Z 0 [ERROR] [MY-010119] [Server] Aborting
- 投稿日:2020-09-10T14:17:43+09:00
【Rails】【Docker】コピペでOK! DockerでRails開発環境を構築する方法
【Rails】【Docker】コピペでOK! DockerでRails開発環境を構築する方法
目次
構築イメージ
今回は3つのコンテナを作成します.
動作環境・前提条件
【動作環境】
OS : macOS 10.14.6
Docker : 19.03.8
ruby : 2.6.5
rails : 5.2.4
【前提条件】
Docker for Macをインストール済みSTEP1. Dockerfileを作成する
まずはDockerフォルダと空ファイルを作成します.
ファイルの内容は後述します.STEP1-1. nginxのDockerfile
以下がnginxのdockerfileになります.
findpro-bangkokはアプリ名なので各自のアプリ名に変更してください.DockerfileFROM nginx:1.15.8 # インクルード用のディレクトリ内を削除 RUN rm -f /etc/nginx/conf.d/* # Nginxの設定ファイルをコンテナにコピー COPY /docker/nginx/nginx.conf /etc/nginx/conf.d/findpro-bangkok.conf # 画像などのpublicファイルはnginxに配置 RUN mkdir -p /findpro-bangkok/public COPY ./public /findpro-bangkok/public # ビルド完了後にNginxを起動 CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.confSTEP1-2. nginxの設定ファイル
nginxの設定を記述するnginx.confを作成します.
nginx.conf# プロキシ先の指定 # Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream puma { # ソケット通信したいのでpuma.sockを指定 server unix:///findpro-bangkok/tmp/sockets/puma.sock; } server { listen 80 default; # ドメインもしくはIPを指定 server_name localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /findpro-bangkok/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @puma; keepalive_timeout 5; # リバースプロキシ関連の設定 location @puma { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://puma; } }STEP1-3. railsのDockerfile
次にrailsのDockerfileを作成します.
DockerfileFROM ruby:2.6.5 RUN apt-get update -qq && \ apt-get install -y apt-utils \ build-essential \ libpq-dev \ nodejs \ vim #各自のアプリ名に変更する ENV RAILS_ROOT /findpro-bangkok RUN mkdir $RAILS_ROOT WORKDIR $RAILS_ROOT COPY Gemfile Gemfile COPY Gemfile.lock Gemfile.lock RUN gem install bundler:2.1.4 RUN bundle install #プロジェクトフォルダ内のすべてのファイルをRailsコンテナ内にコピーする COPY . . #ソケット通信のためのディレクトリを作成 RUN mkdir -p tmp/socketsSTEP2. pumaの設定
以下のconfigフォルダ内のpumaの設定ファイルを編集します.
*pumaフォルダは本番用のフォルダのため今回は青のpuma.rbを編集します.puma.rbthreads_count = ENV.fetch('RAILS_MAX_THREADS') { 5 }.to_i threads threads_count, threads_count port ENV.fetch('PORT') { 3000 } environment ENV.fetch('RAILS_ENV') { 'development' } plugin :tmp_restart app_root = File.expand_path('..', __dir__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", trueSTEP3. docker-composeの作成
docker-composeは複数のコンテナのビルドをまとめて実行してくれる仕組みになります.
docker-composeファイルをプロジェクトフォルダ直下に作成します.
docker-compose.ymlversion: '3' volumes: tmp_data: public_data: services: nginx: build: context: ./ dockerfile: ./docker/nginx/Dockerfile ports: - '80:80' volumes: - public_data:/findpro-bangkok/public - tmp_data:/findpro-bangkok/tmp/sockets depends_on: - app links: - app app: build: context: ./ dockerfile: ./docker/rails/Dockerfile command: bundle exec puma volumes: #.:/findpro-bangkokでプロジェクトのカレントフォルダとコンテナのフォルダを同期しています.これによって変更した箇所を再度ビルドすることなく、コンテナに反映することができます. - .:/findpro-bangkok:cached #nginxとsocket通信するためにホストコンピュータ上にtmp_dataというファイルを作成し、nginxコンテナと共有しています. - tmp_data:/findpro-bangkok/tmp/sockets - public_data:/findpro-bangkok/public tty: true stdin_open: true db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: 'postgres'STEP4. データベースの設定
最後にdatabase.ymlでデータベースの設定をします.
今回はdevelopement環境のため、developmentまでの設定内容を記載します.*testやproductionの記述が下のほうにあるので、そちらは消さずにそのままにしておきます.
# PostgreSQL. Versions 9.1 and up are supported. # # Install the pg driver: # gem install pg # On OS X with Homebrew: # gem install pg -- --with-pg-config=/usr/local/bin/pg_config # On OS X with MacPorts: # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config # On Windows: # gem install pg # Choose the win32 build. # Install PostgreSQL and put its /bin directory on your path. # # Configure Using Gemfile # gem 'pg' # default: &default adapter: postgresql encoding: unicode host: db port: 5432 username: postgres password: postgres pool: 5 # For details on connection pooling, see Rails configuration guide # http://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: findpro-bangkok_development ###以下省略STEP5. コンテナのビルド
それではいよいよ作成したコンテナを起動します.
まずはターミナルでプロジェクトフォルダに移動し、以下のコマンドを実行します.
[JS-MAC findpro-bangkok]$ docker-compose buildビルドが成功したあとに以下のコマンドを実行します.
[JS-MAC findpro-bangkok]$ docker-compose upSTEP6. データベースの作成
最後にデータベースを作成する必要があるので
もう一つ新規にターミナルを起動し、Railsコンテナに入ります。[@JS-MAC findpro-bangkok]$ docker ps #Railsコンテナ(findpro-bangkok_app)のIDを確認 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4549423f21ed findpro-bangkok_nginx "/bin/sh -c '/usr/sb…" 44 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp findpro-bangkok_nginx_1 22ecc47308ae findpro-bangkok_app "bundle exec puma" 44 minutes ago Up 5 seconds findpro-bangkok_app_1 755cb83a9bf4 postgres "docker-entrypoint.s…" 44 minutes ago Up 5 seconds 5432/tcp findpro-bangkok_db_1 [@JS-MAC findpro-bangkok]$ docker exec -it 22e /bin/sh #Railsコンテナにログインする.22eはappコンテナのIDの頭文字です. # rails db:create #データベースを作成する. Database 'findpro-bangkok_development' already exists Database 'findpro-bangkok_test' already exists # rails db:migrate #マイグレーションを実行する.STEP7. 確認
最後にchromeでlocalhostと打ち確認します.
- 投稿日:2020-09-10T13:29:53+09:00
dockerのphp-apacheイメージでのapache再起動
やりたこと
dockerのphp-apacheイメージで不意にapacheが停止した場合、apacheを起動したい。
環境
- dockerimage php:7.4-apache
コマンド
service apache2 start以下はダメ。
service httpd start httpd: unrecognized service/etc/init.d/httpd start bash: /etc/init.d/httpd: No such file or directoryapachectl start AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.24.0.2. Set the 'ServerName' directive globally to suppress this messagephp:7.4-apacheがDebianだからとかなのかhttpdが使えなくて困った。
cat /etc/issue Debian GNU/Linux 10 \n \l
- 投稿日:2020-09-10T11:14:53+09:00
同僚の作成したdockerコンテナをbuildする際にコケたポイントメモ
初めに
同僚が作成してくれたnodeのdockerコンテナをbuildする際に何点かコケたポイントがありましたのでメモしてみます。
同様のケースで嵌っている方がいたら参考になれたらと思います!前提
コンテナを作成してくれた人のPC
Mac Pro
こちらの環境では一発docker-compose up --build
を流せばbuildとupが通る
私のPC
Windows10 Pro
npm --version
6.14.5
数回コケる
コンテナの構成
Node→image: node:latest
MySQL→image: mysql:5.7
Nginx→image: nginx:latestCannot create container for service mysql: Conflict
既にmysqlという名のコンテナが存在するからコンフリクトするぞというエラーですね。
他のnodeやnginxも同様に発生しました。
良くデフォルトの名前でコンテナ名をつける事が多いので、プロジェクト毎にコンテナ名をAservice_mysqlとかユニークな名前を指定するとスムーズかも知れませんね。
既に存在したmysqlコンテナはもう殆ど動かないプロジェクトのものでしたので、docker rm コンテナID
で削除しました。
npm ERR! enoent ENOENT: no such file or directory, rename '/src/node_modules/constantinople' -> '/src/node_modules/.constantinople.DELETE'
constantinopleが見つからないと怒られました。
constantinopleは定数の評価で使用するモジュールのようですね。
https://www.npmjs.com/package/constantinople
使用しているnpmのバージョンを最新にアップデートし解決しました。
6.14.5→6.14.8npm install -g npm仮にこの方法で直らなかった場合、単にnpm install時にmoduleの中身が破損しているパターンや、
package-lock.json
が各モジュールを良くない組み合わせのバージョンで固定しているパターンが考えられるので、
node_modulesの中身をすべて削除する
package-lock.jsonを削除して再度npm installする
を試してみてください。npm ERR! Maximum call stack size exceeded
Nodeの最大コールスタックサイズを超えると発生するようです。
何でMacで起きないのにWindowsでは起きるんだ・・・。
npmのキャッシュを削除して再度buildしたら問題なく起動することができました。npm cache clean --force
参考:https://www.it-swarm.dev/ja/javascript/npm%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E6%9C%80%E5%A4%A7%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%B6%85%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/829336672/
ちなみにnodeのstackサイズを変更すれば暫定的にこのコールスタックサイズ問題は解決しますが、
Nodeのパフォーマンスが悪くなる、最悪動かなくなる恐れがあるので止めた方が無難みたいです。。最後に
同じ開発環境を瞬時に構築できるdockerは開発シーンに必須といえるツールになっていますね!
異なるOSでも動くのは素敵です。
- 投稿日:2020-09-10T10:43:58+09:00
Oracle 11g XE のdocker環境を作成する
概要
手順は以下の通り。
- コンテナイメージを作成
- Windows/Linux版に対応
- docker-compose等で適度にセットアップ
対象
- docker上でデータを含めたoracleインスタンスを立ち上げたい人
免責
本ドキュメントに記載しているコード等は他参考資料由来のもの1を除き、WTFPL2ライセンス2とし、いかなる保証もありません。
なお、エラーハンドリングは緩いので、改善願います。準備
任意フォルダ(tools)に oracle-xe-11.2.0-1.0.x86_64.rpm.zip(Oracle Database 11g Release 2 Express Edition for Linux x64) をダウンロードしておく。
任意フォルダ(tools)に次のバッチを配置する。
※インターネットへの接続が必要get_oracle.bat(Windows用)set WORKING_DIR=%TMP%\oracle_build_wk set CURRENT_DIR=%CD% echo %WORKING_DIR% mkdir %WORKING_DIR% copy oracle-xe-11.2.0-1.0.x86_64.rpm.zip %WORKING_DIR%\ cd %WORKING_DIR% curl --output Dockerfile.xe -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/Dockerfile.xe curl --output checkDBStatus.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/checkDBStatus.sh curl --output runOracle.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/runOracle.sh curl --output setPassword.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/setPassword.sh curl --output xe.rsp -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/xe.rsp docker build %WORKING_DIR% --force-rm=true --no-cache=true --shm-size=1G --build-arg DB_EDITION=xe -t oracle/database:11.2.0.2-xe -f Dockerfile.xe > %CURRENT_DIR%\oracle11g_build.log 2>&1 cd %CURRENT_DIR% del /Q /S %WORKING_DIR% echo DONEget_oracle.sh(Linux用)#!/bin/sh WORKDIR=/tmp/oracle11 CURRENTDIR=$(pwd) mkdir $WORKDIR cp oracle-xe-11.2.0-1.0.x86_64.rpm.zip $WORKDIR/ cd $WORKDIR curl --output Dockerfile.xe -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/Dockerfile.xe curl --output checkDBStatus.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/checkDBStatus.sh curl --output runOracle.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/runOracle.sh curl --output setPassword.sh -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/setPassword.sh curl --output xe.rsp -sSL --url https://github.com/oracle/docker-images/raw/master/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2/xe.rsp DOCKEROPS="" VERSION=11.2.0.2 EDITION="xe" DOCKERFILE="Dockerfile" DOCKEROPS="--shm-size=1G $DOCKEROPS"; IMAGE_NAME="oracle/database:$VERSION-$EDITION" DOCKERFILE="$DOCKERFILE.$EDITION" docker build ./ --force-rm=true --no-cache=true \ $DOCKEROPS --build-arg DB_EDITION=$EDITION \ -t $IMAGE_NAME -f $DOCKERFILE cd $CURRENTDIR rm -rf $WORKDIR echo DONE実行
get_oracle.bat
またはget_oracle.sh
を実行する。
※必要に応じて実行権限を付与してください。(chmod +x get_oracle.sh
)
エラーなく進めば、oracle/database:11.2.0.2-xe
ができます。docker-compose
そのままだと、何らおいしくないので、レシピを載せておく。(永続化しないので、コンテナを作り直したらデータはリセットされます)
docker-compose.ymlversion: '3' services: ## 必要に応じてその他サービスを記述 oracledb_test: image: oracle/database:11.2.0.2-xe ports: - "1521:1521" #- "8080:8080" volumes: # ここのスクリプトがdba権限で動く。sqlplusやimp等を使いたい場合は、shファイルを配置しておくこと # なお、読み取り専用なので、ログファイルの出力を行う場合は、注意すること - ./oracledb/setup:/u01/app/oracle/scripts/setup:ro # 後からコンテ - ./oracledb/mnt:/mnt/local shm_size: 1g environment: - NLS_LANG=Japanese_Japan.UTF8 - TZ=Asia/Tokyooracledb\setup\00_user_create.sql(UTF-8)--勝手にパスワードを振られるので、変更する(絶対違うパスワードを指定してください) ALTER USER sys IDENTIFIED BY manager; ALTER USER system IDENTIFIED BY manager; -- ユーザー作成 CREATE USER test_user IDENTIFIED BY test_user DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON users; -- ロール作成 create role conn_testuser; GRANT CREATE session, CREATE sequence, CREATE trigger, CREATE table, CREATE view, CREATE procedure, CREATE synonym TO conn_scn; -- 権限付与 GRANT conn_testuser TO test_user; --勝手に閉じてくれるので、exit等は不要sqlでデータを投入する場合は、次のようなファイルを作成していく。
oracledb\setup\01_ddl.sql(UTF-8)--スキーマを切り替え ALTER SESSION SET CURRENT_SCHEMA = test_user; --テーブル作成等 --勝手に閉じてくれるので、exit等は不要おまけ: vagrant
Vagrant上でOracleインスタンスも立てちゃう場合は、次のように記載することでイメージの作成までやれる。
仮想マシンのインスタンスメモリは必ず2G以上にすること。(さもなくば、oracleを起動できません)Vagrantfile# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # 中略 #if Vagrant.has_plugin?("vagrant-cachier") # config.cache.scope = :box #end # 中略 config.vm.provision "docker", run: "always" # ここから # Setup docker image for oracle 11g XE environment config.vm.synced_folder "./tools", "/tmp/tools", create: true config.vm.provision "shell", inline: <<-SHELL cd /tmp/tools /bin/sh ./get_oracle.sh SHELL # ここまで config.vm.provision "docker_compose", compose_version: "1.24.1", yml: "/vagrant/docker/docker-compose.yml", run: "always" end参考文献
- Oracle Database on Docker - github
- vagrant+docker-compose環境を構築 - Qiita
- 投稿日:2020-09-10T00:44:18+09:00
docker image 作成時に Jupyter Lab のカスタム設定をする
これまでデータ分析の環境構築の際は、Anacondaで仮想環境を構築して
pip install
とかをしていた。ただこの場合、メモを残しておいたりしない限りは同じ環境を構築できなかったりするので、最近はDockerを使用するようになってきた。基本的には、Jupyter公式のDocker Hubからdocker imageをpullし、必要なものを足していくという感じで環境構築している。(同じように環境構築している人が多い?)
ここで、環境構築時にJupyter Labのショートカットキーの作成も一緒にしてくれると嬉しいと思ったので、そのためのDockerfileの書き方を紹介する。
まだまだDockerについての理解が浅いので間違っていたりしたら指摘してくださるとありがたい。また、簡単なデモが出来るようにGitHubにDockerfileなどをあげておいた。dockerを使用したことがある人なら、Dockerfileを読めばすぐに分かるはず。
設定方法
まず試したこと
単純にjupyterから引っ張ってきたimageからコンテナを作成すると、
~/.jupyter/lab/
の下にはworkspaces/
があるだけ。そこで、コンテナ上でJupyter LabのGUIから
Settings -> Advanced Settings Editor -> Notebook -> User Preferences
に設定を記述すると、~/.jupyter/lab/user-settings/@jupyterlab/
以下に新しくディレクトリとファイルができていることが確認できる。
つまりやることは、docker imageを作成するときに、新しく同じようなディレクトリを作成し、設定ファイルをそのディレクトリに置くだけ。Dockerfile
Dockerfileは以下のように書くことができる。
Dockerfileと同じディレクトリ内に設定用ファイルを置いておけば、それをCOPYするだけで済む。Dockerfile# pull docker image FROM jupyter/datascience-notebook # make directory RUN mkdir -p .jupyter/lab/user-settings/@jupyterlab/notebook-extension/ \ && mkdir -p .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/ # copy setting files COPY tracker.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/notebook-extension/ COPY shortcuts.jupyterlab-settings .jupyter/lab/user-settings/@jupyterlab/shortcuts-extension/ ...このDockerfileからdocker imageをビルドしてcontainerを作成すると、既にカスタム設定が適用されたJupyter Labを確認できる。
設定ファイルについて
tracker.jupyterlab-setting
はNotebookの行数を表示する設定で以下のような内容。tracker.jupyterlab-setting{ "codeCellConfig":{ "lineNumbers": true, }, }
shortcuts.jupyterlab-settings
は、セルを上下させるショートカットキーの設定をしている。ショートカットキーの設定についてはこちらを参考に。shortcuts.jupyterlab-settings{ "shortcuts": [ { "command": "notebook:move-cell-up", "keys": [ "Ctrl Shift K" ], "selector": ".jp-Notebook:focus" }, { "command": "notebook:move-cell-down", "keys": [ "Ctrl Shift J" ], "selector": ".jp-Notebook:focus" }, ] }