Makefile
dockerを自動的に起動するプログラムを作成していますosx
。
起動が完了したら、dockerはシェルでこのコマンドを起動してシェルを設定する必要があります。eval "$(docker-machine env dev)"
問題は、Makefileで実行しようとするとシェルには影響しないことです。
実際に次を起動すると、
make start
dockermake 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
追跡する依存関係がない場合、Makeは正しいツールではない可能性があります。
Makeは各コマンド(または一部のバージョンでは各ルール)に対してシェルを起動します。シェルを構成する必要がある場合は、各インスタンスを構成する必要があります。
プロセスが親プロセスを変更することは不可能です。したがって、Makeに実行中のシェルを変更させるには、dockerと同じトリックを使用しないと不可能です。
Makeが説明したように、
$
それをシェルに渡すにはエスケープする必要があります。これは機能する構造です(ルールを単一のコマンドにまとめたことに注意してください)。しかし、私は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