質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

418閲覧

エイリアスを使用してdockerコマンドと同じ実行結果を得たい(ライブラリのインストール)

begenner

総合スコア79

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/03/29 13:04

編集2023/03/30 00:27

現在Dockerを使用してReact.jsの環境構築をしています。
dockerでReact環境を構築をベースに環境構築し、問題なく動作することは確認できました。

しかし自作のエイリアス(以降エイリアス)を使用してライブラリをインストールしようとしたところ、予期せぬ場所にpackage.jsonライブラリが作成・保存されます。

エイリアスを使用せずにコマンドを直打ちすると期待通りの動作をします。
エイリアスを使用してdocker composeコマンドと同等の実行結果になってほしいのですが何が間違っているのかが分かりません。

わかる方がいらっしゃいましたらアドバイスいただきますようよろしくお願いいたします。

動作環境

下記をDocker環境で動作させています。
TypeScriptは使用していません。

OSmac
reactreact@18.2.0
Docker20.10.23, build 7155243

ディレクトリ構造は以下になります。

bash

1. 2├── Dockerfile 3├── Makefile 4├── README.md 5├── docker-compose.yml 6├── front # reactjsプロジェクト 7├── node_modules 8└── sc # エイリアスが記述してあるファイル

期待する動作

シェルスクリプトで書いたエイリアスのコマンドがdocker-composeコマンドと同じように動作すること。
具体的には
docker compose run --rm front sh -c "cd front && npm install"を実行するとfrontディレクトリ直下にあるpackage.jsonpackage-lock.json、に変更が反映されること。

発生している問題

以下のコマンドを実行するとルートプロジェクト直下にpackage.jsonpackage-lock.jsonnode_modulesが作成されてしまう。

bash

1sc npm install

sc npm install <libraries>を実行して上記の期待する動作と同じ動作・実行結果になってほしい。

該当するコード

docker-compose.yml (1/ 2)

docker

1version: '3.9' 2services: 3 front: 4 build: 5 context: . 6 dockerfile: Dockerfile 7 command: sh -c "cd front && npm start" 8 environment: 9 - NODE_ENV=development 10 ports: 11 - 3000:3000 12 stdin_open: true 13 tty: true 14 volumes: 15 - ./:/usr/src/app 16 - node-modules:/usr/src/app/node_modules:cached 17 18volumes: 19 node-modules:
sc(2/2)

bash

1#!/bin/bash 2 3dc="docker compose" 4 5rm="--rm" 6 7app="front" 8 9# define container name 10app_container="${app_name}-${app}-1" 11 12invoke_run() { 13 $dc run $rm $* 14} 15 16run_app() { 17 invoke_run $app $* 18} 19 20run_npm() { 21 run_app sh -c "cd front && npm $*" 22} 23 24cmd=$1 25shift 26case "$cmd" in 27npm) 28 run_npm $* 29 ;; 30up) 31 # compose_up $* && compose_ps && exit 0 32 compose_up $* && exit 0 33 ;; 34*) 35 read -d '' help <<-EOF 36Usage: $0 command 37

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

scは、エイリアスじゃなくて、シェルスクリプトです。両者は全く異なる概念です。使用目的は似てますが。

引数の処理を把握していない状態では、あまりシェルスクリプトやシェル関数をネストしない方が良いです。
また、汎用に作るのはかなり面倒です。
おそらく、invoke_run() run_app()の中の$*"$@"に書き換えれば良いかと思います。

参考:

bash

1#!/bin/bash 2echo_args(){ 3 i=1 4 for arg 5 do echo "引数[$i]は '$arg'" 6 let i++ 7 done 8} 9foo(){ 10 echo_args $* 11} 12bar(){ 13 echo_args "$@" 14} 15 16echo === foo === 17foo sh -c "cd / && pwd" 18echo === bar === 19bar sh -c "cd / && pwd"

投稿2023/03/29 15:24

編集2023/03/29 15:27
otn

総合スコア84249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問