我有一个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命令
答案 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
命令; docker-compose
。