1. junun

    Posted

    junun
Changes in title
+alpineイメージ使用時に発生するstandard_init_linux.go:211: exec user process caused "no such file or directory" を解決
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,108 @@
+# alpineイメージ使用時に発生するstandard_init_linux.go:211: exec user process caused "no such file or directory" を解決
+Docker X Rails6 X MySQL8で環境構築する際に、初めてalpineイメージを使用するとエラーに出会いました。
+alpineはLinuxディストリビューションの1つで、CentOSやUbuntuよりも軽量なためDockerイメージのサイズを小さくすることができます。
+
+## 各種設定
+```:Dockerfile
+FROM ruby:2.7.0-alpine
+ENV LANG C.UTF-8
+
+RUN mkdir /myapp
+WORKDIR /myapp
+COPY Gemfile /myapp/Gemfile
+COPY Gemfile.lock /myapp/Gemfile.lock
+
+RUN apk update -qq && apk add --no-cache yarn build-base tzdata libxml2-dev mariadb-dev libxslt-dev alpine-sdk mysql-dev nodejs vim g++
+RUN bundle install
+run yarn install
+COPY . /myapp
+
+# Add a script to be executed every time the container starts.
+COPY entrypoint.sh /usr/bin/
+RUN chmod +x /usr/bin/entrypoint.sh
+ENTRYPOINT ["entrypoint.sh"]
+EXPOSE 3000
+
+# Start the main process.
+CMD ["rails", "server", "-b", "0.0.0.0"]
+```
+
+```yml:docker-copose.yml
+~~省略
+ web:
+ build: .
+ command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
+ volumes:
+ - .:/myapp
+ ports:
+ - "3000:3000"
+~~省略
+```
+
+```sh:entrypoint.sh
+#!/bin/bash
+set -e
+
+# Remove a potentially pre-existing server.pid for Rails.
+rm -f /myapp/tmp/pids/server.pid
+
+# Then exec the container's main process (what's set as CMD in the Dockerfile).
+exec "$@"
+```
+
+(他, `Gemfile`,`Gemfile.lock`)
+
+##エラー発生
+```
+$ docker-compose run web rails new .
+```
+
+を実行すると
+
+```
+standard_init_linux.go:211: exec user process caused "no such file or directory
+```
+
+というエラーが発生し、`rails new`は実行できませんでした。
+
+## 原因
+alpineのシェルは`bash`ではなく`ash`だった。
+
+## 解決
+`docker-compose.yml`と`entrypoint.sh`を編集します。
+
+```yml:docker-compose.yml
+ web:
+ build: .
+ # bash → ashに変更
+ command: ash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
+ volumes:
+ - .:/myapp
+ ports:
+ - "3000:3000"
+```
+
+```sh:entrypoint.sh
+#!/bin/sh ←bashからshへ
+set -e
+
+# Remove a potentially pre-existing server.pid for Rails.
+rm -f /myapp/tmp/pids/server.pid
+
+# Then exec the container's main process (what's set as CMD in the Dockerfile).
+exec "$@"
+```
+
+編集後、再度
+
+```
+$ docker-compose run web rails new .
+```
+すれば実行できました。
+
+##参考
+- [dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。](https://qiita.com/yutachaos/items/56dd7ea09d7e2b0d9173)
+
+- [Rails on DockerのQuickstartをalpine linuxでやってみる](https://qiita.com/at-946/items/c69a512ea47941747b18)
+
+- [Docker: standard_init_linux.go:211: exec user process caused “no such file or directory”](https://stackoverflow.com/questions/56832363/docker-standard-init-linux-go211-exec-user-process-caused-no-such-file-or-di)