【问题标题】:Test my go app in a container launched by docker compose with Gitlab CI在 docker compose 使用 Gitlab CI 启动的容器中测试我的 go 应用程序
【发布时间】:2019-01-31 09:14:56
【问题描述】:

我有一个 Golang 应用程序,它依赖于 FTP 服务器。

因此,在 docker compose 中,我构建了一个 FTP 服务并将其引用到我的测试中。

所以,在我的 docker-compose.yml 我有:

version: '3'

services:
  mygoapp:
    build:
      dockerfile: ./Dockerfile.local
      context: ./
    volumes:
      - ./volume:/go
      - ./test_files:/var/test_files

    networks:
      mygoapp_network:
    env_file:
      - test.env
    tty: true


  ftpd-server:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    environment:
      PUBLICHOST: "0.0.0.0"
      FTP_USER_NAME: "julien"
      FTP_USER_PASS: "test"
      FTP_USER_HOME: "/home/www/julien"
    restart: on-failure
    networks:
      mygoapp_network:

networks:
  mygoapp_network:
    external: true

在我的 gitlab-ci.yml 我有

variables:
  PACKAGE_PATH: /go/src/gitlab.com/xxx
  VOLUME_PATH: /var/test_files


stages:
  - test


# A hack to make Golang-in-Gitlab happy
.anchors:
  - &inject-gopath
      mkdir -p $(dirname ${PACKAGE_PATH})
      && ln -s ${CI_PROJECT_DIR} ${PACKAGE_PATH}
      && cd ${PACKAGE_PATH}

test:
  image: docker:18
  services:
    - docker:dind
  stage: test
  #  only:
  #    - production
  before_script:
    - touch test.env
    - apk update
    - apk upgrade
    - apk add --no-cache py-pip
    - pip install docker-compose
    - docker network create mygoapp_network
    - mkdir -p volume/log

  script:
    - docker-compose -f docker-local.yaml up --build -d
    - docker exec project-0_mygoapp_1 ls /var/test_files
    - docker exec project-0_mygoapp_1 echo $VOLUME_PATH
    - docker exec project-0_mygoapp_1 go test ./... -v

我的所有服务都已启动

但是当我跑步时

- docker exec project-0_myapp_1 echo $VOLUME_PATH

我可以看到 $VOLUME_PATH 等于 /var/test_files

但在代码中,当我这样做时:

os.Getenv("VOLUME_PATH")

变量为空

另外,在本地,使用 docker exec,变量是可以的。

我也尝试将变量放入test 定义中,但它仍然不起作用

编辑:我能做到的唯一方法是在 docker compose 中设置环境变量,但这不是很好

知道怎么解决吗?

【问题讨论】:

  • 您找到解决方案了吗?我也不明白你的方法,我没有看到你安装 golang 的位置。它是否已经存在于 Docker 映像中?我正在努力让它工作,但还不能

标签: docker environment-variables gitlab-ci


【解决方案1】:

脚本的行为是可预测的 - 所有环境变量在遇到时都会被扩展(除非它们在单引号中)。所以,你的线

docker exec project-0_myapp_1 echo $VOLUME_PATH

被执行之前被扩展,$VOLUME_PATH 取自 gitlab runner,而不是容器。

我看到从容器内部获取此脚本打印环境变量的唯一方法是将脚本放入 sh-file 并调用该文件:

doit.sh

echo $VOLUME_PATH

gitlab-ci.yml

docker exec project-0_myapp_1 doit.sh

【讨论】:

  • 好的,我明白了,它解释了为什么它不起作用,但我仍然有问题:)
猜你喜欢
  • 1970-01-01
  • 2017-08-03
  • 2016-06-24
  • 2017-07-06
  • 1970-01-01
  • 2018-03-09
  • 2021-08-19
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多