代码之家  ›  专栏  ›  技术社区  ›  Alexander Kondaurov

使文件和Docker附加。如何从其他makefile的任务执行?

  •  0
  • Alexander Kondaurov  · 技术社区  · 7 年前

    我有一个makefile:

    attach:
        docker run --rm \
            -it \
            alpine:3.8
    
    run-inside: attach
        uname -a
    

    我能跑 make attach 类型 uname -a 用手

    找到对应内核版本 例如,

    我想要 run-inside 要运行容器,请附加到它,执行命令并停止容器。可以这样做吗?我需要这个,因为我正在为我的项目设置CI,我需要知道如何在不复制/粘贴的情况下运行

    我知道我能做到:

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

    但这样我就复制了docker命令

    1 回复  |  直到 7 年前
        1
  •  1
  •   ErikMD    7 年前

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

    例如:

    生成文件

    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 是可选的(当 入口点 是一个shell,所以发送的信号 停止容器 可由 tini 进程,以PID 1运行)。

    另外,在配置基于Docker的CI时,可能不需要依赖makefile:它可以很好地工作,但您可能希望:

    • 内联 docker 命令直接位于 .travis.yml .gitlab-ci.yml 左右;
    • 使用A docker-compose.yml 文件和安装 docker-compose 事先。
    推荐文章