无法使用docker-compose run -e选项传递环境变量

时间:2018-10-30 17:02:24

标签: docker docker-compose docker-ce

我正在尝试使用以下命令从命令行获取变量:

 sudo docker-compose -f docker-compose-fooname.yml run -e BLABLA=hello someservicename

我的文件如下:

version: '3'

services:
  someservicename:
    environment:
      - BLABLA
    image: docker.websitename.com/image-name:latest
    volumes:
      - /var/www/image-name
    command: ["npm", "run", BLABLA]

所有这些都是为了让我可以在命令行中运行由用作BLABLA的脚本定义的脚本,我尝试使用official documentation

尝试了以下几种选择:

sudo COMPOSE_OPTIONS="-e BLABLA=hello" docker-compose -f docker-compose-fooname.yml run someservicename

更新: 我不得不说,我总是得到:

WARNING: The FAKE_SERVER_MODE variable is not set. Defaulting to a blank string.

即使我只是运行以下命令(将其删除,也要停止..):

  sudo docker-compose -f docker-compose-fooname.yml stop someservicename

作记录:我先拉图像,我从未构建过图像,但是我的CI / CD工具(gitlab)起作用了,这会影响图像吗?

我正在使用docker-compose版本1.18,docker版本18.06.1-ce,Ubuntu 16.04

1 个答案:

答案 0 :(得分:4)

docker-compose.yml语法无法按您期望的方式工作。如果您写:

command: ["npm", "run", BLABLA]

YAML解析器会将其转换为三个字符串npmrunBLABLA的列表,当Docker Compose看到该列表时,它将尝试按字面意义运行该确切命令,而无需运行shell来尝试解释任何内容。

如果将其设置为字符串,则Docker将在其上运行一个shell,该shell将扩展环境变量;尝试

command: "npm run $BLABLA"

话虽如此,这对Docker Compose的使用有点奇怪。正如services:键所暗示的,更常见的用例是使用docker-compose up启动一些长期运行的服务;您可能会使用npm run start或诸如服务之类的商品,但通常不会拥有没有默认值的完全可参数化的块。

我可能只说docker-compose.yml

version: '3'
services:
  someservicename:
    image: docker.websitename.com/image-name:latest
    command: ["npm", "run", "start"]

如果确实需要执行其他操作,请运行

docker-compose run --rm someservicename npm run somethingelse

(或只使用我的本地./node_modules/.bin/somethingelse而完全不涉及Docker)