Lug*_*ino 4 shell make shell-script
我正在构建一个Makefile
自动启动 docker on 的osx
.
在启动结束时,docker 需要在 shell 上启动此命令以配置 shell: eval "$(docker-machine env dev)"
问题是,如果我尝试在 Makefile 上运行它,这对 shell 没有影响。
事实上,如果启动:
make start
然后make status
我从docker那里得到错误。
这是我的 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
Run Code Online (Sandbox Code Playgroud)
有没有办法eval "$(docker-machine env dev)"
在 Makefile 上启动命令并且会影响 shell?
APr*_*mer 13
如果您没有要跟踪的依赖项,那么 Make 可能不是正确的工具。
Make 为每个命令(或某些版本中的每个规则)启动一个 shell,如果您需要配置 shell,则需要配置每个实例。
进程不可能修改其父进程。因此,如果您希望 Make 修改执行它的 shell,那么如果不使用与 docker 相同的技巧,这是不可能的。
正如$
Make 解释的那样,要将其传递给 shell,需要对其进行转义。
这是一个可行的结构(请注意,我将规则合并到一个命令中),但我再次认为 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
Run Code Online (Sandbox Code Playgroud)