为什么yarn --watch退出(发送SIGTERM)

wal*_*die 8 ruby-on-rails foreman docker docker-compose

我有一个 Docker 安装,我想从它开始docker compose up(并且不必运行 2 个额外的 ttys ),所以我添加了一个 Procfile.dev ,如下所示

\n
web: bin/rails server -p 3000 -b '0.0.0.0'\njs: yarn build_js --watch\ncss: yarn build_css --watch\n
Run Code Online (Sandbox Code Playgroud)\n

然而,输出并不令人愉快

\n
\xe2\x88\x9a mindling % docker compose up\n[+] Running 3/0\n \xe2\xa0\xbf Container mindling_redis       Running                                                                                                                                     0.0s\n \xe2\xa0\xbf Container mindling_db          Running                                                                                                                                     0.0s\n \xe2\xa0\xbf Container mindling_mindling_1  Created                                                                                                                                     0.0s\nAttaching to mindling_db, mindling_1, mindling_redis\nmindling_1      | 19:54:04 web.1  | started with pid 16\nmindling_1      | 19:54:04 js.1   | started with pid 19\nmindling_1      | 19:54:04 css.1  | started with pid 22\nmindling_1      | 19:54:06 css.1  | yarn run v1.22.17\nmindling_1      | 19:54:06 js.1   | yarn run v1.22.17\nmindling_1      | 19:54:06 js.1   | $ esbuild app/javascript/*.* --bundle --outdir=app/assets/builds --watch\nmindling_1      | 19:54:06 css.1  | $ tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --watch\nmindling_1      | 19:54:08 js.1   | Done in 2.02s.\nmindling_1      | 19:54:08 js.1   | exited with code 0\nmindling_1      | 19:54:08 system | sending SIGTERM to all processes\nmindling_1      | 19:54:08 web.1  | terminated by SIGTERM\nmindling_1      | 19:54:09 css.1  | terminated by SIGTERM\nmindling_1 exited with code 0\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试在应用程序容器中运行 Bash - 并在 tty 中调用 Procfile 本身看起来或多或少像这样:

\n
root@facfb249dc6b:/app# foreman start -f Procfile.dev\n20:11:45 web.1  | started with pid 12\n20:11:45 js.1   | started with pid 15\n20:11:45 css.1  | started with pid 18\n20:11:48 css.1  | yarn run v1.22.17\n20:11:48 js.1   | yarn run v1.22.17\n20:11:48 css.1  | $ tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --watch\n20:11:49 js.1   | $ esbuild app/javascript/*.* --bundle --outdir=app/assets/builds --watch\n20:11:50 js.1   | [watch] build finished, watching for changes...\n20:11:53 web.1  | => Booting Puma\n20:11:53 web.1  | => Rails 7.0.0 application starting in development \n20:11:53 web.1  | => Run `bin/rails server --help` for more startup options\n20:11:57 web.1  | Puma starting in single mode...\n20:11:57 web.1  | * Puma version: 5.5.2 (ruby 3.0.3-p157) ("Zawgyi")\n20:11:57 web.1  | *  Min threads: 5\n20:11:57 web.1  | *  Max threads: 5\n20:11:57 web.1  | *  Environment: development\n20:11:57 web.1  | *          PID: 22\n20:11:57 web.1  | * Listening on http://0.0.0.0:3000\n20:11:57 web.1  | Use Ctrl-C to stop\n20:11:58 css.1  | \n20:11:58 css.1  | Rebuilding...\n20:11:59 css.1  | Done in 1066ms.\n^C20:13:23 system | SIGINT received, starting shutdown\n20:13:23 web.1  | - Gracefully stopping, waiting for requests to finish\n20:13:23 web.1  | === puma shutdown: 2021-12-22 20:13:23 +0000 ===\n20:13:23 web.1  | - Goodbye!\n20:13:23 web.1  | Exiting\n20:13:24 system | sending SIGTERM to all processes\n20:13:25 web.1  | terminated by SIGINT\n20:13:25 js.1   | terminated by SIGINT\n20:13:25 css.1  | terminated by SIGINT\nroot@facfb249dc6b:/app# \n
Run Code Online (Sandbox Code Playgroud)\n

到底是怎么回事?它在“手动”执行时有效,但如果我让 docker-compose rip进程会以某种方式终止!?!

\n

我已将问题隔离到build_csspackage.json 中的脚本(或者至少如果我在 Procfile.dev 中评论该行,它会继续存在)

\n
\n

所有的“脏亚麻布”

\n

我的 package.json 看起来像这样

\n
{\n...8<...\n  "scripts": { \n    "build_js": "esbuild app/javascript/*.* --bundle --outdir=app/assets/builds",\n    "build_css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css" \n  }, \n...8<...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的容器非常无聊,看起来几乎和其他人的一样:

\n
FROM ruby:3.0.3\nRUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -\nRUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list\nRUN apt-get update && apt-get install -y nodejs yarn\nWORKDIR /app\nCOPY src/Gemfile /app/Gemfile\nCOPY src/Gemfile.lock /app/Gemfile.lock\nRUN gem install bundler foreman && bundle install\nEXPOSE 3000\nENTRYPOINT [ "entrypoint.sh" ]\n
Run Code Online (Sandbox Code Playgroud)\n
version: "3.9"\n  db:\n    build: mysql\n    image: mindling_db\n    container_name: mindling_db\n    command: [ "--default-authentication-plugin=mysql_native_password" ]\n    ports:\n      - "3306:3306"\n    volumes:\n      - ~/src/mysql_data:/var/lib/mysql\n    environment:\n      MYSQL_ROOT_PASSWORD: secret\n      MYSQL_DATABASE: mindling_development\n\n  mindling:\n    platform: linux/x86_64\n    build: .\n    volumes:\n      - ./src:/app\n    ports:\n      - "3000:3000"\n    depends_on:\n      - db\n\n
Run Code Online (Sandbox Code Playgroud)\n

最后是我的入口点.sh

\n
#!/usr/bin/env bash\nrm -rf /app/tmp/pids/server.pid\nforeman start -f Procfile.dev\n
Run Code Online (Sandbox Code Playgroud)\n

wal*_*die 15

请允许我将功劳归给那些应得的人!!正确答案是由earlopainrails/rails 上的本期中提供的

这实际上是一个几乎令人尴尬的简单修复 - 一旦你知道了:)

将 tty: true 添加到您的 docker-compose.yml - 像这样

  mindling:
    platform: linux/x86_64
    build: .
    tty: true
    volumes:
      - ./src:/app
    ports:
      - "3000:3000"
    depends_on:
      - db

Run Code Online (Sandbox Code Playgroud)