Makefile和Docker附加。如何从其他Makefile的任务执行?

时间:2018-12-27 08:39:55

标签: bash docker makefile

我有一个Makefile:

attach:
    docker run --rm \
        -it \
        alpine:3.8

run-inside: attach
    uname -a

我可以手动运行make attach并键入uname -a

uname -a,例如

我希望run-inside运行容器,附加容器,执行命令并停止容器。是否有可能做到这一点?我需要这样做是因为我正在为我的项目设置CI,并且我需要知道如何在不复制/粘贴的情况下运行

我知道我可以做到:

run:
    docker run --rm \
        alpine:3.8 uname -a

但是这样我就复制了docker命令

1 个答案:

答案 0 :(得分:1)

可能的解决方案包括使用docker run-d--detach)选项以及docker exec命令。

例如:

  

Makefile

IMAGE ?= alpine:3.8
NAME ?= foobar
RUN = docker exec $(NAME)

all: start run-inside stop

start:
    docker run -d -i --name=$(NAME) --rm --init $(IMAGE)

run-inside:
    $(RUN) cat /etc/os-release
    $(RUN) uname -a

stop:
    docker stop $(NAME)

.PHONY: all start run-inside stop

关于传递给docker run的选项:

  • -d告诉Docker引擎在后台运行容器;
  • -i是保持容器运行所必需的(而-t在这里没有用);
  • --name指定容器的名称;
  • --rm会在容器停止后立即触发容器的移除(此处是docker stop);
  • --init是可选的(当 entrypoint 是shell时特别方便,这样docker stop发送的信号可以由{{3}立即处理}过程,以PID 1的身份运行。

顺便说一句,在配置基于Docker的CI时可能不需要依赖Makefile:它可以很好地工作,但是您可能想要:

  • 直接用docker.travis.yml左右插入要使用的.gitlab-ci.yml命令;
  • 使用tini文件并预先安装docker-compose