bash - Jenkins 内部 docker-compose 的环境变量

标签 bash shell jenkins docker environment-variables

我有以下设置:

Jenkins 环境运行 docker-compose 但我需要将环境变量传递给 yml 文件:

示例 docker-compose.yml

version: '2'

services:  
  logon_server:
    build: .
    image: my_server:0.0.1
    ports:
      - "9200:9200"
    command: ${DOCKER_CMD_EXEC}
    networks:
      - my_ntwrk

networks:
  my_ntwrk:

当我在我的 mac 上的 shell 提示符下运行以下脚本时,我可以传递不同的命令来执行并且一切正常:

执行测试.sh

#!/bin/bash

chmod 755 docker/exec-*.sh

# Setup env variables
export DOCKER_CMD_EXEC=/ci_e2e.sh

# Optional: record current versions
docker -v && docker-compose -v

echo `whoami` 

echo `sudo -E -u admin printenv`

# Build, deploy and run E2E test cases
sudo -E -u admin docker-compose up --no-color --abort-on-container-exit

当我在我的 jenkins 作业中运行脚本时,在“构建环境”->“执行 Shell”->“命令”下,这是我正在谈论的图像:

Example of shell command

我收到以下错误:

The DOCKER_CMD_EXEC variable is not set. Defaulting to a blank string

我试过以 root 身份和默认用户“admin”运行它,这就是 jenkins 运行的身份。我试图使环境变量可继承,尝试打印 env,一切看起来都不错。

我可以通过取消设置 DOCKER_CMD_EXEC 在我的 mac 上重现错误,但我无法弄清楚为什么在 jenkins 中会发生这种情况!

如有任何帮助,我们将不胜感激!

谢谢。

J

最佳答案

这是我的解决方案:

Docker 脚本:

#!/bin/bash
export COMPOSE_HTTP_TIMEOUT=120
export DOCKER_CMD_EXEC=/app/docker/ci_run.sh
export DOCKER_LINKED_CMD=/app/docker/ci_run.sh
export DOCKER_NODE_ENV=staging
export DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG:=staging}
export DOCKER_RELOAD_DB=${PARAM_RELOAD_DB:=true}
export DOCKER_HTTP_PROXY=''

# Optional: record current versions
docker -v && docker-compose -v

# Startup container(s)
cat compose.yml | envsubst | docker-compose -f - up

compose.yml 文件:

version: '2'

services:   
  app:
    build: .
    image: ${DOCKER_IMAGE_TAG}
    environment:
      - MONGODB_HOST=mongodb
      - NODE_ENV=${DOCKER_NODE_ENV}
      - HTTP_PROXY=${DOCKER_HTTP_PROXY}
    ports:
      - "8000:8000"
    command: ${DOCKER_CMD_EXEC}
    volumes:
      - /dev/shm:/dev/shm
    networks:
      - server-ntwk

networks:
  server-ntwk:

bash脚本和compose文件在同一个目录下:

./docker/exec-build.sh

关于bash - Jenkins 内部 docker-compose 的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728841/

相关文章:

android - 无法创建任务或键入 checkenv 原因名称未定义

bash - 如何捕获更改文件夹中文件的事件?

bash - 字符串扩展 - 将带引号的变量转义为值

linux - 时间选项不起作用

Jenkins 管道: abort an input in a stage cannot trigger the aborted post action of that stage

jenkins - 增加 Jenkins 注销计时器不起作用

bash - 合并数百万文件的最快方法

shell - 在不同的 shell 中执行命令

shell - ksh 使用逻辑 OR 验证字符串

linux - 无法使用 set -eo pipefail 在管道中成功调用任何外部 shell 脚本