20210428のdockerに関する記事は11件です。

Spring boot + Gradle + Vue.js + MySql + VS Code + Docker (WSL2)で開発環境を構築する。

まえがき  クリアしたいこと ホストマシンに特定のjdkを入れたくない springはホットリロードもデバックもしたい docker-composeにフロントバックDBオールインワンしたい VS Code使いたい なぜ書いたか 全部盛りの情報があんまりなかったので 実際に開発を始められるところまで環境構築を書いてる情報があまりなかったので 備忘録として git この記事の最後の手順まで実施したものを置いておきます。 https://github.com/PokoPoko2ry/docker_vue_spring_sample/tree/master 前提 VS Codeインストール済み Dockerインストール済み(試した環境はDocker For Windows + WSL2) ディレクトリ構成 とりあえず下記の形でDockerのホスト環境(WSL)に作成 . ├── .devcontainer ├── docker │ ├── mysql │ │ ├── initdb │ │ └── my.cnf │ ├── spring │ └── vue ├── [spring-project] └── [vue-project] docker-compose.ymlを作成 docker/に作成 vueはデフォルトだとspringとportがぶつかるので、9000としました。 docker-compose.yml version: '3.6' services: mysql: container_name: mysql build: ../docker/mysql environment: MYSQL_DATABASE: mysqldb MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: rootpassword ports: - 3306:3306 volumes: - ./mysql/initdb:/docker-entrypoint-initdb.d - mysql_db:/var/lib/mysql backend: container_name: backend build: ./spring depends_on: - mysql ports: - "8080:8080" tty: true volumes: - ../spring_project:/srv:cached working_dir: /srv frontend: container_name: frontend build: ./vue ports: - 9000:8080 volumes: - ../vue_project:/usr/src/app:cached stdin_open: true tty: true volumes: mysql_db: driver: local Dockerfileを作成 spring docker/spring に作成 FROM openjdk:11 VOLUME /tmp RUN mkdir /app WORKDIR /app vue docker/vue に作成 FROM node:lts WORKDIR /usr/src/app/ RUN npm install -g npm && \ npm install -g @vue/cli mysql docker/vue に作成 FROM mysql EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf #docker runに実行される CMD ["mysqld"] docker/mysql に設定ファイルを作成しておきます。文字コードを設定。 my.conf [mysqld] character-set-server=utf8 [mysql] default-character-set=utf8 [client] default-character-set=utf8 springのプロジェクトを作成 spring initializrを使用させてもらう。 https://start.spring.io/ いったんこんな感じで作成 Generateしたら、吐き出されるZIPを解凍してspringのプロジェクト格納先に置いておきましょう。 dbの接続のために、 src/main/resources配下に、application.ymlを作成しておきます。 application.yml spring: datasource: url: jdbc:mysql://mysql:3306/mysqldb username: user password: password driver-class-name: com.mysql.cj.jdbc.Driver vueのプロジェクト作成 vue cliを使いたいので一度コンテナを立ち上げます。 $ docker-compose build $ docker-compose up -d Recreating mysql ... done Recreating frontend ... done Recreating backend ... done $ docker exec -it frontend /bin/bash はいれたらvue createでプロジェクトをお好みの内容で作成後、動作確認をします。 $ vue create . <省略> $ npm run serve npm run serveを実行すると localhost:8080 に行けと言われるかもしれませんが、composeファイルで9000番を指定したので ポートは9000番を指定します。 確認 (http://localhost:9000) ここまでできたら、一度 docker-compose downでコンテナを止めます。 $ exit $docker-compose down Removing backend ... done Removing mysql ... done Removing frontend ... done Removing network docker_default vscodeのセットアップ ホスト側(WSL上)で 拡張機能の Remote Development をインストール。 This Remote Development extension pack includes three extensions: ということで Remote - SSH Remote - Containers Remote - WSL が同時に入ります。 次に、Remote container用の設定ファイルを作成。 .devcontainer\に、devcontainer.json を作成するとremote containerにattachした時のvs codeの設定を読み込んでくれます(便利) devcontainer\devcontainer.json { "name": "spring-vue-mysql", "workspaceFolder": "/srv", "dockerComposeFile": "../docker/docker-compose.yml", "settings": { "terminal.integrated.shell.linux": "/bin/bash", }, "service": "backend", //attachするコンテナはspringを指定 "extensions": [ "vscjava.vscode-java-pack", // JavaExtensionPack "pivotal.vscode-boot-dev-pack", // Spring Boot Extension Pack "gabrielbb.vscode-lombok" //Lombok Annotations Support For VS Code ], } "name" → 設定に名前を付ける。任意の内容で大丈夫かと。 "workspaceFolder" → containerにattachした後、どのフォルダを開くか。ここではvolumeのバインド先のdirを設定 "dockerComposeFile" → 立ち上げるコンテナのcomposeファイルを指定。 "settings" → shellを指定。 "service" → composeを使用するので、どのコンテナにattachするのかを指定する。 "extensions" → container側にインストールしておきたいVS Code拡張機能のextansion Idを入力。 APIを作成 起動がうまくいったかどうかの確認で疎通を取りたいため、 java/com/example/spring-projectにAPIを作成。 vueからの実行確認を取りたいのでCORS対策でアノテーションをつけておきます。 controller/HelloController.java package com.example.spring_project.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @CrossOrigin(origins = {"http://localhost:9000"}) public class HelloController { @RequestMapping("/hello") public String hello() { return "hello world!"; } } Remote containerを実行する VS code左下の><のところを押す。 devcontainer.jsonの文法エラーがなくvscodeに正しく認識されていれば、 [Remote-Containers: Reopen in Container]が選択できると思うので実行。 json内で指定したdocker-compose.ymlをもとに、containerが立ち上がり、 containerにattachされた状態でvscodeが再起動します。 springを実行 VS Codeが立ち上がった後、左下の吹き出しでjavaのprojectをimportするか?的なことを聞かれると思うので Yesを押します。 その後、左側のメニューから 1 Run and Debugを実行。 実行環境を選ぶように言われるので、Javaを選択します。 しばらく待ちます・・・ ?のアイコンを押すと進捗が見れます。 終わると、デバッガがアプリを立ち上げてくれます。 動作確認 実行を確認します。 先ほど作成したAPIにアクセス! http://localhost:8080/hello debugを試してみます。 ついでにreturnの内容を変えて、ホットリロードされるかも試してみます。 下図のようにソースを変更、break poitnを指定して保存後、ブラウザをリロード。 このように止まり、ブラウザの内容も変わりました! vueコンテナからAPIを叩いてみます。 VS Codeのwindowを新しく立ち上げて、frontendコンテナに入ったのち、axiosをinstall $ docker exec -it frontend /bin/bash $ npm install --save axios vue-axios API実行の処理を書きます。 main.jsとApp.vueを下記のように変更。 APIのレスポンス内容をalertで表示するだけの簡単な機能を実装します。 main.js import Vue from 'vue' import App from './App.vue' import axios from 'axios' import VueAxios from 'vue-axios' Vue.config.productionTip = false Vue.use(VueAxios, axios) new Vue({ render: h => h(App), }).$mount('#app') App.vue <template> <div id="app"> <input @click="HelloWorld" type="button" value="HelloWorld"> </div> </template> <script> export default { name: 'App', methods: { HelloWorld() { this.axios.get('http://localhost:8080/hello') .then((response) => { alert(response.data); }) .catch((e) => { alert(e); }); } } } </script> vueをスタートし、実行を試してみます。 $ npm run serve → http://localhost:9000 できました? コンテナ立ち上げと同時にvueのサーバーが立ち上がるように、Dockerfileを編集します FROM node:lts WORKDIR /usr/src/app/ RUN npm install -g npm && \ npm install -g @vue/cli CMD [ "npm", "run", "serve" ] //追加 最後に 指摘や改善案、編集リクエストなどあればどんどん頂けると嬉しいです。 参考にさせていただいた記事 VS Code Vue spring & docker projectのimportに関してちょこちょこエラーが出る場合が見られました。原因がよくわかってないですが、今のところ全部VS CodeをReloadで治ってます。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spring boot + Vue.js + MySql + VS Code + Docker で開発環境を構築する

まえがき  クリアしたいこと ホストマシンに特定のjdkを入れたくない springはホットリロードもデバックもしたい docker-composeにフロントバックDBオールインワンしたい VS Code使いたい なぜ書いたか 全部盛りの情報があんまりなかったので 実際に開発を始められるところまで環境構築を書いてる情報があまりなかったので 備忘録として git この記事の最後の手順まで実施したものを置いておきます。 https://github.com/PokoPoko2ry/docker_vue_spring_sample/tree/master 前提 VS Codeインストール済み Dockerインストール済み(試した環境はDocker For Windows + WSL2) ディレクトリ構成 とりあえず下記の形でDockerのホスト環境(WSL)に作成 . ├── .devcontainer ├── docker │ ├── mysql │ │ ├── initdb │ │ └── my.cnf │ ├── spring │ └── vue ├── [spring-project] └── [vue-project] Dockerのセットアップ docker-compose.ymlを作成 docker/に作成 vueはデフォルトだとspringとportがぶつかるので、9000としました。 docker-compose.yml version: '3.6' services: mysql: container_name: mysql build: ../docker/mysql environment: MYSQL_DATABASE: mysqldb MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: rootpassword ports: - 3306:3306 volumes: - ./mysql/initdb:/docker-entrypoint-initdb.d - mysql_db:/var/lib/mysql backend: container_name: backend build: ./spring depends_on: - mysql ports: - "8080:8080" tty: true volumes: - ../spring_project:/srv:cached working_dir: /srv frontend: container_name: frontend build: ./vue ports: - 9000:8080 volumes: - ../vue_project:/usr/src/app:cached stdin_open: true tty: true volumes: mysql_db: driver: local Dockerfileを作成 spring docker/spring に作成 FROM openjdk:11 VOLUME /tmp RUN mkdir /app WORKDIR /app vue docker/vue に作成 FROM node:lts WORKDIR /usr/src/app/ RUN npm install -g npm && \ npm install -g @vue/cli mysql docker/vue に作成 FROM mysql EXPOSE 3306 ADD ./my.cnf /etc/mysql/conf.d/my.cnf #docker runに実行される CMD ["mysqld"] docker/mysql に設定ファイルを作成しておきます。文字コードを設定。 my.conf [mysqld] character-set-server=utf8 [mysql] default-character-set=utf8 [client] default-character-set=utf8 環境のセットアップ springのプロジェクトを作成 spring initializrを使用させてもらう。 https://start.spring.io/ いったんこんな感じで作成 Generateしたら、吐き出されるZIPを解凍してspringのプロジェクト格納先に置いておきましょう。 dbの接続のために、 src/main/resources配下に、application.ymlを作成しておきます。 application.yml spring: datasource: url: jdbc:mysql://mysql:3306/mysqldb username: user password: password driver-class-name: com.mysql.cj.jdbc.Driver vueのプロジェクト作成 vue cliを使いたいので一度コンテナを立ち上げます。 $ docker-compose build $ docker-compose up -d Recreating mysql ... done Recreating frontend ... done Recreating backend ... done $ docker exec -it frontend /bin/bash はいれたらvue createでプロジェクトをお好みの内容で作成後、動作確認をします。 $ vue create . <省略> $ npm run serve npm run serveを実行すると localhost:8080 に行けと言われるかもしれませんが、composeファイルで9000番を指定したので ポートは9000番を指定します。 確認 (http://localhost:9000) ここまでできたら、一度 docker-compose downでコンテナを止めます。 $ exit $docker-compose down Removing backend ... done Removing mysql ... done Removing frontend ... done Removing network docker_default vscodeのセットアップ ホスト側(WSL上)で 拡張機能の Remote Development をインストール。 This Remote Development extension pack includes three extensions: ということで Remote - SSH Remote - Containers Remote - WSL が同時に入ります。 次に、Remote container用の設定ファイルを作成。 .devcontainer\に、devcontainer.json を作成するとremote containerにattachした時のvs codeの設定を読み込んでくれます(便利) devcontainer\devcontainer.json { "name": "spring-vue-mysql", "workspaceFolder": "/srv", "dockerComposeFile": "../docker/docker-compose.yml", "settings": { "terminal.integrated.shell.linux": "/bin/bash", }, "service": "backend", //attachするコンテナはspringを指定 "extensions": [ "vscjava.vscode-java-pack", // JavaExtensionPack "pivotal.vscode-boot-dev-pack", // Spring Boot Extension Pack "gabrielbb.vscode-lombok" //Lombok Annotations Support For VS Code ], } "name" → 設定に名前を付ける。任意の内容で大丈夫かと。 "workspaceFolder" → containerにattachした後、どのフォルダを開くか。ここではvolumeのバインド先のdirを設定 "dockerComposeFile" → 立ち上げるコンテナのcomposeファイルを指定。 "settings" → shellを指定。 "service" → composeを使用するので、どのコンテナにattachするのかを指定する。 "extensions" → container側にインストールしておきたいVS Code拡張機能のextansion Idを入力。 APIを作成 起動がうまくいったかどうかの確認で疎通を取りたいため、 java/com/example/spring-projectにAPIを作成。 vueからの実行確認を取りたいのでCORS対策でアノテーションをつけておきます。 controller/HelloController.java package com.example.spring_project.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @CrossOrigin(origins = {"http://localhost:9000"}) public class HelloController { @RequestMapping("/hello") public String hello() { return "hello world!"; } } 環境の立ち上げと動作確認 Remote containerを実行する VS code左下の><のところを押す。 devcontainer.jsonの文法エラーがなくvscodeに正しく認識されていれば、 [Remote-Containers: Reopen in Container]が選択できると思うので実行。 json内で指定したdocker-compose.ymlをもとに、containerが立ち上がり、 containerにattachされた状態でvscodeが再起動します。 springを実行 VS Codeが立ち上がった後、左下の吹き出しでjavaのprojectをimportするか?的なことを聞かれると思うので Yesを押します。 その後、左側のメニューから 1 Run and Debugを実行。 実行環境を選ぶように言われるので、Javaを選択します。 しばらく待ちます・・・ ?のアイコンを押すと進捗が見れます。 終わると、デバッガがアプリを立ち上げてくれます。 動作確認 実行を確認します。 先ほど作成したAPIにアクセス! http://localhost:8080/hello debugを試してみます。 ついでにreturnの内容を変えて、ホットリロードされるかも試してみます。 下図のようにソースを変更、break poitnを指定して保存後、ブラウザをリロード。 このように止まり、ブラウザの内容も変わりました! vueコンテナからAPIを叩いてみます。 VS Codeのwindowを新しく立ち上げて、frontendコンテナに入ったのち、axiosをinstall $ docker exec -it frontend /bin/bash $ npm install --save axios vue-axios API実行の処理を書きます。 main.jsとApp.vueを下記のように変更。 APIのレスポンス内容をalertで表示するだけの簡単な機能を実装します。 main.js import Vue from 'vue' import App from './App.vue' import axios from 'axios' import VueAxios from 'vue-axios' Vue.config.productionTip = false Vue.use(VueAxios, axios) new Vue({ render: h => h(App), }).$mount('#app') App.vue <template> <div id="app"> <input @click="HelloWorld" type="button" value="HelloWorld"> </div> </template> <script> export default { name: 'App', methods: { HelloWorld() { this.axios.get('http://localhost:8080/hello') .then((response) => { alert(response.data); }) .catch((e) => { alert(e); }); } } } </script> vueをスタートし、実行を試してみます。 $ npm run serve → http://localhost:9000 できました? コンテナ立ち上げと同時にvueのサーバーが立ち上がるように、Dockerfileを編集します FROM node:lts WORKDIR /usr/src/app/ RUN npm install -g npm && \ npm install -g @vue/cli CMD [ "npm", "run", "serve" ] //追加 最後に 指摘や改善案、編集リクエストなどあればどんどん頂けると嬉しいです。 参考にさせていただいた記事 VS Code Vue spring & docker projectのimportに関してちょこちょこエラーが出る場合が見られました。原因がよくわかってないですが、今のところ全部VS CodeをReloadで治ってます。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカルのコンテナの出力をFluentdでS3に保存する

やりたいこと ローカルでFluentdコンテナを動かして、他のコンテナの標準出力を集めてS3にログを保存したい。 構成 Fluentdコンテナと、サンプルとしてそこに出力を送り込むNginxコンテナを作ります。 ├─fluentd │ docker-compose.yml │ Dockerfile │ fluent.conf │ └─nginx docker-compose.yml Fluentdコンテナ Dockerfile FROM fluent/fluentd:v1.12.2-1.0 # Timezone ARG TZ RUN echo ${TZ} USER root RUN apk add --update --no-cache tzdata && \ cp /usr/share/zoneinfo/${TZ} /etc/localtime && \ echo ${TZ} > /etc/timezone && \ apk del tzdata # AWS ARG AWS_KEY_ID ARG AWS_SEC_KEY ARG S3_BUCKET ARG AWS_REGION ENV AWS_KEY_ID=${AWS_KEY_ID} ENV AWS_SEC_KEY=${AWS_SEC_KEY} ENV S3_BUCKET=${S3_BUCKET} ENV AWS_REGION=${AWS_REGION} # for fluentd v1.0 or later RUN gem install fluent-plugin-s3 --no-document # Config USER fluent COPY fluent.conf /fluentd/etc/ デフォルトだとログのタイムスタンプがUTCになってしまうのでタイムゾーンの設定と、S3出力のためのプラグインをインストールします。 docker-compose.yml version: '3.7' services: fluentd: build: context: ./ args: TZ: Asia/Tokyo AWS_KEY_ID: XXXXXXXXXXXXXXXX AWS_SEC_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX S3_BUCKET: mybucket AWS_REGION: ap-northeast-1 restart: always ports: - 24224:24224 - 24224:24224/udp タイムゾーンとAWSのアクセスキーと出力先のバケットを渡します。 fluent.conf <source> @type forward port 24224 bind 0.0.0.0 </source> <match debug.**> @type copy <store> @type file path /fluentd/log/debug time_slice_format %Y%m%dT%H%M time_slice_wait 5m </store> <store> @type stdout </store> </match> <match s3.**> @type s3 aws_key_id "#{ENV['AWS_KEY_ID']}" aws_sec_key "#{ENV['AWS_SEC_KEY']}" s3_bucket "#{ENV['S3_BUCKET']}" s3_region "#{ENV['AWS_REGION']}" check_object false time_slice_format %Y%m%dT%H%M time_slice_wait 5m path fluentd_logs/ s3_object_key_format %{path}%{time_slice}/%{hms_slice}.%{file_extension} </match> <match **> @type stdout </match> s3.**タグにマッチした入力がS3に保存されるように設定します。 確認用に保存のタイミングを短くしています。 コンテナの起動・確認 Fluentdコンテナを起動して、直接データを入力してみます。 >docker-compose up -d >docker-compose exec fluentd sh $ echo '{"hello":"fluentd"}' | fluent-cat debug.test $ ls -l /fluentd/log/debug/ -rw-r--r-- 1 fluent nogroup 57 Apr 28 14:00 buffer.b5c1014353321a2e64426684b2464c202.log -rw-r--r-- 1 fluent nogroup 79 Apr 28 14:00 buffer.b5c1014353321a2e64426684b2464c202.log.meta $ ls -l /fluentd/log/ drwxr-xr-x 2 fluent nogroup 4096 Apr 28 14:07 debug -rw-r--r-- 1 fluent nogroup 57 Apr 28 14:04 debug.20210428T1400.log $ cat /fluentd/log/debug.20210428T1400.log 2021-04-28T14:00:52+09:00 debug.test {"hello":"fluentd"} $ echo '{"hello":"fluentd"}' | fluent-cat s3.test >aws s3 ls s3://mybucket/fluentd_logs/ PRE 20210428T1400/ コンテナ内部とS3にログが保存されることが確認できました。 S3にはgzip形式でログが保存されます。 Nginxコンテナ docker-compose.yml version: '3.7' services: web: image: nginx:latest ports: - "80:80" logging: driver: "fluentd" options: fluentd-address: "localhost:24224" tag: "s3.docker.{{.Name}}" fluentd-async-connect: "true" Nginxの公式イメージはデフォルトでアクセスログを標準出力にエラーログを標準エラー出力に吐くのでロギング・ドライバにFluentdを指定すればそのままログが流れます。 コンテナを起動して、NginxデフォルトページにアクセスするとS3にアクセスログが保存されているのが確認できます。 2021-04-28T14:55:31+09:00 s3.docker.nginx_web_1 {"source":"stdout","log":"172.23.0.1 - - [28/Apr/2021:05:55:31 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36\" \"-\"","container_id":"410c2125509ef500c8a22a3093c95ac1b9ee51d9ff893a4d062f7bb7fb56a8c9","container_name":"/nginx_web_1"}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python で MemoryError を捕捉する方法

Overview けっこう昔にこんな投げっぱなしな感じの記事書いたんですけど、 https://qiita.com/arc279/items/d400c92d6019afc665eb その派生というか、 docker 内のプロセスが OOMKiller に始末されるのを避けて MemoryError を捕捉する方法です。 事前準備と予備知識 とりあえずメモリを500MB に制限して docker で python を起動します。 docker周り たまたま手元にあったのが python:3.7.6-slim だったので別に深い意味はないです。 docker-compose.yml version: '3.9' services: node: image: python:3.7.6-slim volumes: - .:/mnt deploy: resources: limits: memory: 500M reservations: memory: 500M tty: true command: bash bash # 起動して $ docker-compose up # コンテナに入る $ docker-compose exec node bash コンテナ内で確認  docker のメモリ制限は cgroup で制限されてるので、確認はこう。 bash root@33fc41fd23a2:/# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 500MB に制限されてますね。 memory_swap を設定しない場合の swap はメモリ指定の2倍になってるそうです。 ちなみに free とか /proc/meminfo には反映されないので注意。 ホストから14GB割り当ててる場合の図 root@33fc41fd23a2:/# cat /proc/meminfo | grep Mem MemTotal: 14334276 kB MemFree: 13063124 kB MemAvailable: 13221092 kB root@33fc41fd23a2:/# free total used free shared buff/cache available Mem: 14334276 468032 12900708 409740 965536 13210688 Swap: 1048572 43808 1004764 python でヒープサイズの上限 特に指定しないと無制限になってるので、 python >>> import resource >>> resource.getrlimit(resource.RLIMIT_DATA) (-1, -1) メモリ 500MB の状況で 4GB くらい確保しようとすると python >>> try: ... bytearray(4000 * 1024 ** 2) ... except Exception as e: ... print(type(e), e) ... Killed except できず問答無用で OOM Killer に始末されて死んじゃいます。 ヒープサイズに制限をかける で、無言で死んでしまうとちょっと困るので、これをなんとか捕捉したい。 上限を設定します ヒープサイズの上限を500MBに設定した! >>> import resource >>> resource.setrlimit(resource.RLIMIT_DATA, (524288000, -1)) >>> print(resource.getrlimit(resource.RLIMIT_DATA)) (524288000, -1) で、再度実行 python >>> try: ... bytearray(4000 * 1024 ** 2) ... except Exception as e: ... print(type(e), e) ... <class 'MemoryError'> except で補足できました。 ちなみに MemoryError は無口なので str(e) しても特に文言がありません。 なので type(e) しないと分かりづらいので注意。 上記をまとめると ヒープサイズの上限を /sys/fs/cgroup/memory/memory.limit_in_bytes の値に設定してやれば良さそうです。 trap_memory_error.py import resource # 500MB しかなくても 4GB確保したい alloc_size = 4000 * 1024 ** 2 with open("/sys/fs/cgroup/memory/memory.limit_in_bytes", "r") as fp: memory_limit_in_bytes = int(fp.read()) print("alloc_size", alloc_size) print("/sys/fs/cgroup/memory/memory.limit_in_bytes", memory_limit_in_bytes) resource.setrlimit(resource.RLIMIT_DATA, (memory_limit_in_bytes, -1)) print(resource.getrlimit(resource.RLIMIT_DATA)) try: bytearray(alloc_size) print("OK") except MemoryError as e: print(type(e), e) bash root@33fc41fd23a2:/mnt# python trap_memory_error.py alloc_size 4194304000 /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 (524288000, -1) <class 'MemoryError'> なお、ヒープ上限を設定しないと 上記の resource.setrlimit の行をコメントアウトして実行すると、普通に OOM Killer に始末されて死にます。 root@33fc41fd23a2:/mnt# python no-trap_memory_error.py alloc_size 4194304000 /sys/fs/cgroup/memory/memory.limit_in_bytes 524288000 (-1, -1) Killed っていう話。 プロセスの確保可能なヒープサイズに上限を設定することでプロセス内で捕捉するのが肝なので、 同様の手段があれば python 以外でもできると思います。 cf. https://docs.python.org/ja/3/library/resource.html https://qiita.com/toshihirock/items/236b7541016929060cc0 https://yanomy.hatenablog.com/entry/2018/07/31/221957
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL2上でyoloを動かしてみる

TL;DR 練習がてらv2でもv3でもない無印yoloをWSL2上で動かしてみました。 以下の記事とサイトを参考にさせていただきました。 モチベーション なんか画像系AIさわってみたい。でもGPUは極力使いたくない。 とりあえず流行りのyoloにさわってみよう。 コンテナ用意 docker-composeで用意しました。 Dockerfile FROM python:3.7-buster WORKDIR /opt/work docker-compose.yml version: '3' services: yolo: build: context: . dockerfile: Dockerfile container_name: 'python371' tty: true volumes: - ./work:/opt/work コンテナ環境の整備 コンテナに入ったらひたすらコマンドを叩きます。 apt update && apt -y upgrade apt install -y libgl1-mesa-dev git git clone https://github.com/thtrieu/darkflow.git pip install --upgrade pip pip install numpy -U pip install opencv-python==3.4.5.20 pip install tensorflow==1.15 pip install Cython cd darkflow python setup.py build_ext --inplace pip install -e . pip install . mkdir bin weightsを用意 上の作業で作成したbin/に以下のyolo.weightsを設置します。 GoogleDriveからweightsをDLLします。 動作確認 とりあえず動くかだけ確認します。 from darkflow.net.build import TFNet import os import cv2 os.chdir('darkflow') option = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1} tf = TFNet(option) imgcv = cv2.imread("/opt/work/src/hogehoge.jpg") print(tf.return_predict(imgcv)) 結果 無事動作を確認できました。 別のプログラムで人を検出するところまでは確認できました。 今回はここまでとして、具体的に動かす部分は別途試していきたいです。 最後に 学習済みモデルでも結構色々遊べるみたいです。 学習者側からすると嬉しい限りです。 注意および免責事項 本記事の内容はあくまで私個人の見解であり、所属する組織の公式見解ではありません。 本記事の内容を実施し、利用者および第三者にトラブルが発生しても、筆者および所属組織は一切の責任を負いかねます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerコマンドリスト

Dockerコマンドのリスト Dockerイメージの確認 ローカルに保存したコンテナイメージの一覧を表示。 docker images Dockerコンテナの確認(起動中のコンテナ) 現在のコンテナの稼働状況を確認。起動中のコンテナのみを表示します。 docker ps Dockerコンテナの確認(全て) "-a"オプションを付けることで、停止中のも含めて全てのコンテナを表示します。 docker ps -a Dockerファイルからイメージを作成 docker build -t [イメージ名]:[タグ名] Dockerファイルのあるディレクトリ docker build -t test . DockerイメージからDockerコンテナを立ち上げる docker run --name [コンテナ名] -dit \ -p [ホスト側のポート]:[コンテナ側のポート] \ [イメージ名] -name:任意のコンテナ名を指定する -d:デタッチモード(コンテナの起動をバックグラウンドで行う) -p:ポートの指定 コンテナの起動 docker start [コンテナ名 or コンテナID] コンテナの削除 docker rm [コンテナ名 or コンテナID] バインドマウント(ディレクトリの同期) docker run --name [コンテナ名] -d \ -v [ホスト側のディレクトリ]:[コンテナ側のマウントポイント] \ -p [ホスト側のポート]:[コンテナ側のポート] \ [イメージ名] コンテナに入る docker exec -it [コンテナIDまたはコンテナ名] bash コンテナの中に入ったときに、文字化けを起こすときの対処法 locale 文字コードを確認する もしからであれば下記を実行する export LANG=en_US.UTF-8 コンテナから出る exit ホストマシンのファイルをコンテナ内にコピーする docker cp \ [ホスト上のコピーしたいファイルのパス] \ [コンテナ名orコンテナID]:[コピー先パス] ホストマシンのファイルをコンテナ内に追加する docker add \ [ホスト上のコピーしたいファイルのパス] \ [コンテナ名orコンテナID]:[コピー先パス]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】コマンド一発でWebコンテンツが格納されたフォルダをhttp://localhost/でテストする。

Dockerを用い、公式のnginxコンテナでやります。 何番煎じか分かりませんが、シンプルな記事が少なかったのでメモとして。 条件 Dockerが使える環境 コンテナ名(任意):nginx-container Webコンテンツが格納されたフォルダ:/home/username/public_html ポート番号:8080 テスト用に、/home/username/public_htmlに次のファイルを置いておく index.html <html> <body> index </body> </html> コマンド docker run \ --name nginx-container \ -v /home/username/public_html:/usr/share/nginx/html:ro \ -p 8080:80 \ -d \ nginx:latest 結果 http://localhost:8080/ へアクセスし「index」と表示されれば成功です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu Docker buildでSIGABRT: abortというエラーが出たときの対処方法

docker buildでabortする。 完全に自分用メモです。場当たり的な解決方法を使ったのでオススメできる解決方法ではありません。 以下のように見たことないエラーが起きました。レジスタの内容を表示したり、見たこと無いエラーです。 free(): invalid pointer SIGABRT: abort PC=0x7efdc7a07fb7 m=0 sigcode=18446744073709551610 signal arrived during cgo execution goroutine 1 [syscall, locked to thread]: runtime.cgocall(0x4afd50, 0xc420047cc0, 0xc420047ce8) /usr/lib/go-1.8/src/runtime/cgocall.go:131 +0xe2 fp=0xc420047c90 sp=0xc420047c50 github.com/docker/docker-credential-helpers/secretservice._Cfunc_free(0x8d6da0) github.com/docker/docker-credential-helpers/secretservice/_obj/_cgo_gotypes.go:111 +0x41 fp=0xc420047cc0 sp=0xc420047c90 github.com/docker/docker-credential-helpers/secretservice.Secretservice.List.func5(0x8d6da0) /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/obj-x86_64-linux-gnu/src/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go:96 +0x60 fp=0xc420047cf8 sp=0xc420047cc0 github.com/docker/docker-credential-helpers/secretservice.Secretservice.List(0x0, 0x756060, 0xc420078000) /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/obj-x86_64-linux-gnu/src/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go:97 +0x217 fp=0xc420047da0 sp=0xc420047cf8 github.com/docker/docker-credential-helpers/secretservice.(*Secretservice).List(0x77e548, 0xc420047e88, 0x410022, 0xc4200142e0) <autogenerated>:4 +0x46 fp=0xc420047de0 sp=0xc420047da0 github.com/docker/docker-credential-helpers/credentials.List(0x756ba0, 0x77e548, 0x7560e0, 0xc42000e018, 0x0, 0x10) /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/obj-x86_64-linux-gnu/src/github.com/docker/docker-credential-helpers/credentials/credentials.go:145 +0x3e fp=0xc420047e68 sp=0xc420047de0 github.com/docker/docker-credential-helpers/credentials.HandleCommand(0x756ba0, 0x77e548, 0x7ffc7fd4e79f, 0x4, 0x7560a0, 0xc42000e010, 0x7560e0, 0xc42000e018, 0x40e398, 0x4d35c0) /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/obj-x86_64-linux-gnu/src/github.com/docker/docker-credential-helpers/credentials/credentials.go:60 +0x16d fp=0xc420047ed8 sp=0xc420047e68 github.com/docker/docker-credential-helpers/credentials.Serve(0x756ba0, 0x77e548) /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/obj-x86_64-linux-gnu/src/github.com/docker/docker-credential-helpers/credentials/credentials.go:41 +0x1cb fp=0xc420047f58 sp=0xc420047ed8 main.main() /build/golang-github-docker-docker-credential-helpers-cMhSy1/golang-github-docker-docker-credential-helpers-0.5.0/secretservice/cmd/main_linux.go:9 +0x4f fp=0xc420047f88 sp=0xc420047f58 runtime.main() /usr/lib/go-1.8/src/runtime/proc.go:185 +0x20a fp=0xc420047fe0 sp=0xc420047f88 runtime.goexit() /usr/lib/go-1.8/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc420047fe8 sp=0xc420047fe0 goroutine 17 [syscall, locked to thread]: runtime.goexit() /usr/lib/go-1.8/src/runtime/asm_amd64.s:2197 +0x1 rax 0x0 rbx 0x7ffc7fd4e000 rcx 0x7efdc7a07fb7 rdx 0x0 rdi 0x2 rsi 0x7ffc7fd4dd90 rbp 0x7ffc7fd4e100 rsp 0x7ffc7fd4dd90 r8 0x0 r9 0x7ffc7fd4dd90 r10 0x8 r11 0x246 r12 0x7ffc7fd4e000 r13 0x1000 r14 0x0 r15 0x30 rip 0x7efdc7a07fb7 rflags 0x246 cs 0x33 fs 0x0 gs 0x0 Sending build context to Docker daemon 8.704kB 原因 以下に書いてありました。 strange errors on docker build · Issue #103 · docker/docker-credential-helpers I don't think there is a link to docker-compose other than on Ubuntu where installing compose pulls in the golang-docker-credential-helpers dependency, triggering the issue to start appearing. Removing the credentials helper package with dpkg -r --force-depends removes this issue and leaves docker-compose working fine. For a more practical workaround install with pip or script on Docker's docs site. バグとしては以下のパッケージによるもののようです。 Bug #1792824 “golang-docker-credential-helpers is unneeded dep” : Bugs : docker-compose package : Ubuntu 解決方法 dpkgコマンドが自分の環境では動かなかったので、pip3を使いました。 練習用の仮想環境だったので、雑に解決しています。おすすめできる方法ではありません。 sudo apt-get purge docker-compose sudo apt-get autoremove sudo apt-get install python3-pip ## ここからが雑な解決法 # pip自身をアップデート sudo pip3 install -U pip # パッケージを一括アップデート pip list --outdated | tail -n +3 | awk '{print $1}' | xargs sudo pip install -U # docker-composeをインストール sudo pip3 install docker-compose 参考 Pythonのモジュールをpipで一括アップデートする方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「DockerでNuxt.jsとLaravelの環境を作りたい」と思い立ったので、4つのコマンドで実行できるようにしたよ

はじめに はじめまして! 最近Nuxt.jsとLaravelで開発することが増えてきたので、Dockerで環境を作りました。 意外とヒットする記事がないので書いてみることにしました。 環境 Dockerfile PHP(7.4-fpm-buster) Nginx(1.18-alpine) MySQL(5.7) Node.js(14.15.3-alpine) 作れる環境 Nuxt.js Laravel TypeScript Vue3.0(Composition-API) Storybook Github コードはすべてGitHubに上げています。 詳しく確認されたい方はこちらをご確認ください。 それでは環境を作っていきましょう! ターミナル $ git clone git@github.com:ssk9597/Docker-Laravel-Nuxt-Nginx-MySQL.git $ cd Docker-Laravel-Nuxt-Nginx-MySQL $ make nuxt $ make backend この4つのコマンドで、Nuxt.jsとLaravelの環境ができました。 ただこのままでは、Nuxt.jsとLaravel間での通信ができないため一部ファイルの修正が必要です。 それでは修正していきましょう! ファイルの修正 frontend フロントエンドは2つのファイルの修正をします。(一応検証のためにpages/index.vueも修正します。) nuxt.config.jsの修正 frontend/nuxt.config.js const environment = process.env.NODE_ENV || 'development'; require('dotenv').config(); export default { modules: [ '@nuxtjs/axios', '@nuxtjs/proxy', '@nuxtjs/dotenv', ], proxy: { '/api': environment === 'development' ? process.env.API_URL : 'https://www.example.org', }, axios: { baseURL: process.env.API_URL, browserBaseURL: process.env.API_BROWSER_URL, credentials: true, }, }; .envの修正 .env API_URL=http://web/api API_BROWSER_URL=http://localhost:10080/api pages/index.vueの修正で検証 frontend/pages/index.vue <template> <div> <h1 class="title"> {{ text }} </h1> </div> </template> <script> export default { async asyncData({ $axios }) { const text = await $axios.$get('/'); return { text, }; }, data() { return { text: '', }; }, }; </script> api api側は検証のために1つファイルを修正します。 api/routes/api.php <?php Route::get("/", function () { return "Hello World!"; }); これで完了です。 こうなります。 しっかり通信できてますね! ここからは任意で追記していきましょう! TypeScript TypeScriptの導入はファイルの追記も必要になります。 ターミナル $ make typescript ファイルの修正 shims-vue.d.tsに追記 frontend/shims-vue.d.ts declare module '*.vue' { import Vue from 'vue'; export default Vue; } tsconfig.jsonに追記 frontend/tsconfig.json { "compilerOptions": { "target": "ES2018", "module": "ESNext", "moduleResolution": "Node", "lib": ["ESNext", "ESNext.AsyncIterable", "DOM"], "esModuleInterop": true, "allowJs": true, "sourceMap": true, "strict": true, "noEmit": true, "experimentalDecorators": true, "baseUrl": ".", "paths": { "~/*": ["./*"], "@/*": ["./*"] }, "types": ["@nuxt/types", "@types/node"] }, "files": ["shims-vue.d.ts"], "include": [ "components/**/*.ts", "components/**/*.vue", "layouts/**/*.ts", "layouts/**/*.vue", "pages/**/*.ts", "pages/**/*.vue" ], "exclude": ["node_modules", ".nuxt", "dist"] } Composition-API Composition-APIの導入も、ファイルの追記が必要になります。 ターミナル $ make composition-api ファイルの修正 プラグインの追加 frontend/plugins/composition-api.ts import Vue from 'vue'; import VueCompositionApi from '@vue/composition-api'; Vue.use(VueCompositionApi); nuxt.config.jsに追加 frontend/nuxt.config.js export default { plugins: ['@/plugins/composition-api'], }; Storybook Storybookの導入はコマンドだけでOKです。 ターミナル $ make storybook // 再起動したいとき $ make re-storybook これでフルパッケージの環境が作れます! だいぶ簡単ですね。 ここからはたくさんコードを書いて開発していきましょう!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Redis】DockerのLaravel環境にRedisとphpredisを導入する

初めに Laravelの日本語ドキュメントをもとにDockerのLaravel環境にRedisを導入しようとしたところ、細かいところで追加の操作が必要だったので導入方法を備忘録として残しておきます。 環境 Docker v20.10 Laravel v6.20 Redis v6.2 phpredis v5.3 ディレクトリ構造 ├── laravel ├── infra │   └─ php │ └─ Dockerfile └── docker-compose.yml docker-compose.ymlにredisコンテナを定義する docker-compose.yml version: "3.8" volumes: php-fpm-socket: services: app: build: ./infra/php volumes: - php-fpm-socket:/var/run/php-fpm - ./laravel:/work/laravel redis: image: "redis:latest" ports: - "16379:6379" appコンテナでphpredisを有効化する phpredisのパッケージをpecl経由でインストールしappコンテナで有効化します。 Dockerfile FROM php:7.4-fpm-buster RUN apt update && \ apt -y install && \ pecl install redis && \ docker-php-ext-enable redis WORKDIR /work/laravel ここで気を付けなければならない点は、pecl install redisをした時点ではphpredisが有効になっていません。 この状態でlaravelのRedisファサードを使用しても PHP Error: Class 'Redis' not found in /path/to/laravel/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php on line 75 のように\Redisクラスが見つからないというエラーが発生します。 なので、pecl install redisを実行した後、忘れずにdocker-php-ext-enable redisを実行しましょう。 .envのREDIS_HOSTを設定する .envのREDIS_HOSTにRedisコンテナ名を指定します。 .env APP_NAME=Laravel ... REDIS_HOST=redis app.phpのエイリアスからRedisを削除 app.php <?php return [ // 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, // 'Redis' => Illuminate\Support\Facades\Redis::class, // これを削除かコメントアウトする // ], ]; laravelからRedisにデータを追加できるか確認 まずはappコンテナからRedisにデータを追加します。 $ docker-compose exec app bash :/work/laravel php artisan tinker >>> use Illuminate\\Support\\Facades\\Redis; >>> Redis::set("str", "test"); redisコンテナのRedisに上記のデータが保存されていたら設定完了です。 $ docker-compose exec redis bash :/data redis-cli > keys * 1) "laravel_database_str" # デフォルトで"laravel_database"がプレフィックスとして付加される > get laravel_database_str "test"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac でDocker上にXサーバーを立ち上げる際に詰まった箇所

MacでDocker上にXQuartzを立ち上げてGUIアプリを表示したい 上記を試みた際にめちゃくちゃハマってしまったため、個人的な覚書として書いておきます。 Qiitaでもいくつか記事が出ていたのですが、それでもハマってしまったポイントをメモ。 まずXQuartzをmacへインストールします。 brew cask install xquartz ↓ XQuartsの環境設定->セキュリティ->ネットワーク•クライアントからの接続を許可にチェックを入れる ↓ 一度XQuartzを再起動する 後はdocker -runの際にdisplayにlocalhostのアドレスを指定したらいいだけ、、、、 docker run -it --rm --name $containerName \ -e DISPLAY=docker.for.mac.localhost:0 \ のはずだったのですが、自分の環境では何回やってもこれでXサーバーが立ち上がりませんでした。 さまざまな記事をみながら格闘して1日。。。結局原因として分かったのは、macとXQuartzへのパスが通っていなかったためでした。 Dockerを立ち上げる際に、shell script もしくはterminalから以下のコマンドを打つことで解消しました。 export PATH=$PATH:/usr/X11/bin export CPATH=$CPATH:/usr/X11/include export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/X11/lib xhost + 127.0.0.1 同様に詰まっている方の参考になれば幸いです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む