3

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

 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 定义的脚本,我尝试过使用官方文档

尝试了几个选项,包括:

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

4

1 回答 1

5

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

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

YAML 解析器会将其转换为三个字符串npmrun和的列表BLABLA,当 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)

于 2018-10-30T20:15:56.827 回答