Аргументы команды определения контейнера ECS / Fargate

Мы пытаемся запустить дальний контейнер на AWS ECS. В определении контейнера мы имеем

"command": [
        "/bin/bash",
        "-c",
        "\"envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'\""
      ]

Я также пробовал:

"command": [
        "/bin/bash",
        "-c",
        "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
      ]

Используя docker run, мы могли бы успешно использовать:

docker run -p 8000:80 -e "VAR1=somevalue" -d nginx-sample:latest /bin/bash -c "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

И в мире кубернетов (что тоже работает):

 containers:
      env:
      - name: VAR1
        value: "somevalue"
      command: ["/bin/bash"]
      args: ["-c", "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

Мы пока не можем заставить это работать в AWS Fargate. Мне непонятно, как мы должны правильно передавать аргументы. Кажется, что контейнеры закрываются до того, как смогут запуститься, но явных сообщений журнала нет, поэтому не совсем понятно, почему. Я думаю, что что-то я делаю неправильно с синтаксисом в том, как передаются аргументы команды для /bin/bash -c.


person David    schedule 24.02.2019    source источник


Ответы (2)


В конце концов, правильный синтаксис (ну, по крайней мере, тот, который нам подошел) был:

"command": [
        "/bin/bash",
        "-c",
        "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
      ],

Наша реальная проблема на самом деле оказалась в том, что мы определили проверку работоспособности контейнера следующим образом:

"healthCheck": {
        "retries": 5,
        "command": [
          "CMD-SHELL",
          "curl --fail http://localhost/health || exit 1"
        ],
        "timeout": 10,
        "interval": 30,
        "startPeriod": 30
      },

И мы забыли проверить, что curl действительно был установлен внутри контейнера. Мы считали само собой разумеющимся, что он будет там, но на изображении nginx:latest это не так - я полагаю, что это справедливо для меньшего размера и меньшей поверхности атаки в качестве вектора эксплойта. В итоге мы просто установили curl в наш Dockerfile, после этого все было хорошо.

person David    schedule 24.02.2019

Попробуйте этот подход

"entryPoint": [
        "/bin/bash",
        "-c"
      ],
"command": [
        "envsubst < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
      ],

У нас это работало, когда нам приходилось делать что-то подобное.

В нашем случае мы использовали entryPoint, чтобы заставить контейнер игнорировать команду base image. Затем дал дополнительную команду в command arry.

Если я не верю, ECS использует базовое изображение _4 _ (_ 5_) и запускает что-либо в массиве command поверх него. Я просто размышляю об этом; поскольку я не могу понять, почему другой способ просто не работает.

person Praveen Premaratne    schedule 24.02.2019