Makefileを介してシェルにコマンドを送信する

Makefileを介してシェルにコマンドを送信する

Makefiledockerを自動的に起動するプログラムを作成していますosx

起動が完了したら、dockerはシェルでこのコマンドを起動してシェルを設定する必要があります。eval "$(docker-machine env dev)"

問題は、Makefileで実行しようとするとシェルには影響しないことです。
実際に次を起動すると、
make startdockermake statusでエラーが発生します。

これは私のMakefileです。

CURRENT_DIRECTORY := $(shell pwd)

start:
    @sh run.sh -d
    @eval $(docker-machine env dev)

start-compose:
    @docker-compose up -d

clean:
    @docker-compose rm --force

stop:
    @docker-compose stop

shutdown:
    @docker-compose stop
    @docker-machine stop dev

build:
    @docker-compose build

status:
    @docker-compose ps

cli:
    @docker-compose run --rm web bash

log:
    @docker-compose logs web

logall:
    @docker-compose logs

restart:
    @docker-compose stop web
    @docker-compose start web

restartall:
    @docker-compose stop
    @docker-compose start

.PHONY: clean start start-compose stop status shutdown build cli log logall restart restartall

eval "$(docker-machine env dev)"Makefileでコマンドを起動し、そのコマンドがシェルに影響を与える方法はありますか?

ベストアンサー1

  1. 追跡する依存関係がない場合、Makeは正しいツールではない可能性があります。

  2. Makeは各コマンド(または一部のバージョンでは各ルール)に対してシェルを起動します。シェルを構成する必要がある場合は、各インスタンスを構成する必要があります。

  3. プロセスが親プロセスを変更することは不可能です。したがって、Makeに実行中のシェルを変更させるには、dockerと同じトリックを使用しないと不可能です。

  4. Makeが説明したように、$それをシェルに渡すにはエスケープする必要があります。

  5. これは機能する構造です(ルールを単一のコマンドにまとめたことに注意してください)。しかし、私はMakeがこの種の仕事に適したツールだとは思わず、私はdockerについて何も知りません。関連するものがありません。

    start:
        @sh run.sh -d; \
        echo $$(docker-machine env dev) > ./docker-config
    
    start-compose:
        @eval $$(cat ./docker-config); \
        docker-compose up -d
    
    clean:
        @eval $$(cat ./docker-config); \
        docker-compose rm --force
    
    stop:
        @eval $$(cat ./docker-config); \
        docker-compose stop
    
    shutdown:
        @eval $$(cat ./docker-config); \
        docker-compose stop ; \
        docker-machine stop dev
    

おすすめ記事