Docker Compose在命令中使用管道。

8

我在docker-compose(1.7版本0d7bf73,compose文件格式版本1)中运行以下内容时遇到了问题,但从命令行(docker 1.10.3)中可以正常工作:

docker run --rm --entrypoint="/bin/bash" node:4 -c "node gridd.js -t | ./node_modules/bunyan/bin/bunyan"

我的 Docker Compose 文件:

grid:
  image: node:4-slim
  entrypoint: /bin/bash
  command: -c "node gridd.js -t | ./node_modules/bunyan/bin/bunyan"

使用此docker-compose文件将导致以下结果:
marcel@client ~/grid $ docker-compose -f ../docker-compose-test.yml -p test up
Removing test_grid_1
Recreating 4e0104efc149_4e0104efc149_4e0104efc149_test_grid_1

ERROR: for grid  Container command not found or does not exist.
Attaching to

我还尝试使用exec方法和将docker-compose命令作为列表执行,但结果相同。

2个回答

2
2021年,使用docker-compose v2.0.0-beta.6版本时:
当涉及到|&&时,command字段的行为令人惊讶。
预期
我可以自由地在命令中使用管道和&&,它们将被倒入bash -c中。
我认为这是Docker的正常情况;提供command作为字符串与作为数组之间的行为不同。
实际
命令似乎只是在|&&处被截断,尾部被忽略!!!
糟糕的是,没有错误提示。此外,在Docker中没有找到任何关于如何使用command内容的文档(在Docker中有这样的文档)。

下面的实验表明,如果我显式地以bash -c开头启动命令,我可以在命令中使用|&&
注意:语法版本3.9(最新)的行为相同。
version: '3.0'

services:
  abc:
    image: debian:latest
    #command: 'echo a | grep -v a'   # a (wrong)
    #command: 'echo a | grep x'      # a (wrong)
    #
    #command: bash -c 'echo a | grep -v a'   # (empty) 
    #command: bash -c 'echo a | grep a'   # a 
    command: bash -c 'echo a && false'   # (exits with code 1) 

测试方法:

  • 将上述内容粘贴到docker-compose.yml文件中
  • docker compose up

注意: 如果完整命令也被引用,稍微长一点的命令会让你在引用时变得很麻烦。因此,我没有使用引号留下了bash -c


哦不...我怎么能像printf 'y' | ping那样做呢? - ji-ruh
@ji-ruh,你只需要在前面使用 sh -c(或者 bash -c),就可以保证安全了。 - akauppi

0

好的,这一定是docker-compose中的一个bug。只要我将docker-compose.yml文件移动到当前目录并且不使用-f标志指定它,一切都可以正常工作 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接