keboola / docker-bundle

Docker Runner component
MIT License
1 stars 1 forks source link

Run container as a non-root user #198

Open ondrejhlavacek opened 7 years ago

ondrejhlavacek commented 7 years ago

Cures the chown script in https://github.com/keboola/syrup-router/issues/64

ondrejhlavacek commented 7 years ago

Not possible, container commands not accessible, eg. ping: permission denied (are you root?).

ondrejhlavacek commented 7 years ago

martin [12:50 PM] a kdyz by to nespoustelo docker pod rootem? (edited)

najlos [12:55 PM] hm, https://docs.docker.com/engine/installation/linux/linux-postinstall/#manage-docker-as-a-non-root-user

[12:56] takže by se to vyhodilo ze sudoers a managovalo přes groupu, vyzkouším (edited)

new messages martin [12:58 PM] jj takhle to ma ECS optimized ami

[12:58]

[ec2-user@connection-testing-sapi-ecs-i-0e9e62636f2001145 ~]$ groups
ec2-user wheel docker

(edited)

ondrejhlavacek commented 6 years ago
[ec2-user@kbc-devel-02 ~]$ sudo docker run --user $(id -u):$(id -g) alpine ping google.com
PING google.com (216.58.198.78): 56 data bytes
ping: permission denied (are you root?)
[ec2-user@kbc-devel-02 ~]$ sudo docker run --user $(id -u):$(id -g) centos ping google.com
PING google.com (216.58.198.78) 56(84) bytes of data.
64 bytes from dub08s02-in-f14.1e100.net (216.58.198.78): icmp_seq=1 ttl=45 time=1.08 ms
64 bytes from dub08s02-in-f14.1e100.net (216.58.198.78): icmp_seq=2 ttl=45 time=1.16 ms

takže je to problém konkrétního image.

ondrejhlavacek commented 6 years ago

Tady https://github.com/gliderlabs/docker-alpine/issues/253 jsem se dočetl, že může pomoct nainstalovat jinej ping

[ec2-user@kbc-devel-02 ~]$ cat Dockerfile 
FROM alpine

RUN apk update && \
    apk upgrade && \
    apk add iputils
[ec2-user@kbc-devel-02 ~]$ sudo docker build . -t alpine-ping-test
...
[ec2-user@kbc-devel-02 ~]$ sudo docker run --user $(id -u):$(id -g) alpine-ping-test ping google.com
PING google.com (216.58.198.78) 56(84) bytes of data.
64 bytes from dub08s02-in-f14.1e100.net (216.58.198.78): icmp_seq=1 ttl=45 time=1.09 ms
64 bytes from dub08s02-in-f78.1e100.net (216.58.198.78): icmp_seq=2 ttl=45 time=1.17 ms

Takže to bude asi konrkétni instalace pingu nebo "unprivileged icmp sockets". Jdu to zkoumat dál.

ondrejhlavacek commented 6 years ago

wget projde

[ec2-user@kbc-devel-02 ~]$ sudo docker run --user $(id -u):$(id -g) alpine wget  https://raw.githubusercontent.com/keboola/kbc-ui/master/package.json -O /tmp/wget.test
Connecting to raw.githubusercontent.com (151.101.0.133:443)
wget.test            100% |*******************************|  5033   0:00:00 ETA
Halama commented 6 years ago

a curl jede bez instlace něčeho navíc?

ondrejhlavacek commented 6 years ago

jdu zkusit

ondrejhlavacek commented 6 years ago

curl v alpine není :-)

[ec2-user@kbc-devel-02 ~]$ sudo docker run --user $(id -u):$(id -g) -it alpine /bin/sh
/ $ curl
/bin/sh: curl: not found
Halama commented 6 years ago

aha, tvl, to znamená že PHP appky přes guzzle tam fallbackují na něco jinýho?

ondrejhlavacek commented 6 years ago

no a nebo instalace PHP instaluje i curl?

Halama commented 6 years ago

Mě teda curl šel:

 apk add curl
(1/4) Installing ca-certificates (20171114-r0)
(2/4) Installing libssh2 (1.8.0-r2)
(3/4) Installing libcurl (7.59.0-r0)
(4/4) Installing curl (7.59.0-r0)
Executing busybox-1.27.2-r8.trigger
Executing ca-certificates-20171114-r0.trigger
OK: 19 MiB in 23 packages
ondrejhlavacek commented 6 years ago

No ale to jsi ho instaloval ručně, v čistým alpine mi ho to teď nenašlo. V php:7-cli je curl, ale zase tam není ping.

ondrejhlavacek commented 6 years ago

Nebo když pustíš docker run alpine curl google.com, tak ti to proběhne?

Halama commented 6 years ago

jo, sorry já myslel jako jestli jede když se tam doinstaluje. V php php:7-alpine vidím že už je.

ondrejhlavacek commented 6 years ago

No tak to samozřejmě jede :-)

ondrejhlavacek commented 6 years ago

Takže jsem prostě měl pech, že na alpine byl špatnej ping a normálně by to mělo jet. 👿

Je možný, že to způsobí ještě nějakou neplechu, takže bych to udělal následovně

0) ~Zkusit pár komponent ručně~ 1) Bude se to zapínat přes featuru komponenty, nové komponenty to budou automaticky mít všechny zapnuté 2) Postupně to zapneme na našich komponentách (testovací job by to měl všechno odhalit, procesory si budeme muset vyzkoušet ručně) 3) Pak bych vytáhl seznam nejpouživanějších komponent, a ty, které dokážeme nakonfigurovat, bych otestoval bokem, jinak bych to asi loopnul s vendorama 4) Pokud během toho nenarazíme na žádnej problém, tak bych to zapnul pro všechny

Halama commented 6 years ago
ondrejhlavacek commented 6 years ago

Jo, to by bylo super!

Halama commented 6 years ago

stejně to asi bude feature na developer-portal ne?

odinuv commented 6 years ago

nj, to bude

ondrejhlavacek commented 6 years ago

jj, https://keboola.slack.com/archives/C1G9B2XMW/p1525256271000467

ondrejhlavacek commented 6 years ago

0) zkusit pár jobů ručně

ondrejhlavacek commented 6 years ago

Pustil jsem několik S3 extractor jobů s procesorama, zanořenejma folderama atd a vše proběhlo bez problémů, ještě jsem to ověřoval variantou bez normalizace a bez usera, kdy to vyfailovalo na oprávněních.

Halama commented 6 years ago

co je normalizace?

odinuv commented 6 years ago

chmod ( = normalizace opravneni)

ondrejhlavacek commented 6 years ago

@Halama @odinuv mam takovej blbej pocit, že z tohodle se může stát dlouhodobej strašák (než to probublá před developer portal, developer portal ui, synchronzační skript, apod), tak co kdybych to prostě nadrzo zapnul? asi bych to dokázal v developer portalu i UI udělat, ale byla by to pro mě velká odbočka, a než se k tomu někdo dostane, může to trvat :-(

ondrejhlavacek commented 6 years ago

Můžu featuru zapnout přes projekty.

odinuv commented 6 years ago

to je chaoticky, kdyz narazime na komponentu, ktera s tim nepojede, tak co? budem sledovat ve kterych projektech je nakonfigurovana? co kdyz si ji tam nekdo prida?

v devportal ui to (hned) byt nemusi

odinuv commented 6 years ago

navic na to bez toho component flagu ani nepujdou napsat testy ne?

ondrejhlavacek commented 6 years ago

To by asi šly, ale bylo by to komplikovanější. No chtěl jsem to jenom odbavit, když víme, jak na to, a ne to nechávat měsíce otevřený. V UI to bejt nemusí, pravda, klidně nikdy :-)

ondrejhlavacek commented 6 years ago

requires https://github.com/keboola/developer-portal/pull/197 & https://github.com/keboola/connection/issues/1350

ondrejhlavacek commented 6 years ago

-> https://github.com/keboola/internal/issues/15

ondrejhlavacek commented 6 years ago

tak jsem se ještě trochu začetl a odložím si

podle ^^^ bych teda asi zkusil jinej storage driver

ondrejhlavacek commented 6 years ago

(https://docs.docker.com/storage/storagedriver/select-storage-driver/#suitability-for-your-workload)

ondrejhlavacek commented 6 years ago

na testing jsem nahodil overlay2 a zkouším, co udělá

{
  "mtu": 1500,
  "debug": false,
  "storage-driver": "overlay2",
  "log-opts": {
    "max-size": "10m",
    "max-file": "1"
  }
}
ondrejhlavacek commented 6 years ago

integrační orchestrace se zrychlila z 6:40 na 4:40 https://connection.keboola.com/admin/projects/395/orchestrations/292003114

ondrejhlavacek commented 6 years ago

jdu to zkusit na devel-03 a pustit proti tomu celej test

odinuv commented 6 years ago

ten write uvnitr kontejneru by nas vubec nemel trapit, data i tmp mame pres volume a jinam v podstate neni duvod zapisovat

ondrejhlavacek commented 6 years ago

@odinuv jde taky o to, jak jsou uložený metadata kontejnerů a podobný věci, dost to může ovlivnit

na devel-03 overlay2 nenastartuju, takže bych asi pustil něco ostřejšího na tom testingu

odinuv commented 6 years ago

co to pustit na travisu?

ondrejhlavacek commented 6 years ago

Tam se dá nastavit Docker storage driver?

odinuv commented 6 years ago

mozna jo https://github.com/travis-ci/travis-enterprise-worker-installers/pull/7 https://github.com/lukecyca/travis-docker-example/blob/master/.travis.yml

ondrejhlavacek commented 6 years ago

Nojo, na travisu to vypadá na default na overlay2, takže všechny testy tam už teda proběhly.

Je to tak

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.09.0-ce
Storage Driver: overlay2
...

(https://travis-ci.org/keboola/docker-bundle/jobs/389526100#L565 via https://github.com/keboola/docker-bundle/commit/f7440d9c0f1b39fddfc0bedaf468500157926bde)

ondrejhlavacek commented 6 years ago

udělal jsem na testingu stress test

5x ./vendor/bin/phpunit Tests --filter ImageBuilderTest 5x sudo docker build . -t test --no-cache (https://bitbucket.org/mhumpolec/kbc-salesforce-extractor/src/master/Dockerfile, byl zrovna po ruce)

devicemapper se sekl a docker build jel úplně příšerně, během 10 minut nebyl schopnej těch 5 images zbuildovat, stejně tak nedoběhly ani ty testy overlay2 doběhl jako by se nechumelilo, než jsem sepsat tenhle comment, doběhlo všeh 5 buildů a všechny testy

odinuv commented 6 years ago

to vypada az neuveritelne dobre!

ondrejhlavacek commented 6 years ago

io + net stress test 1: https://connection.keboola.com/admin/projects/232/applications/keboola.custom-science-php/402881536 io + net stress test 2: https://connection.keboola.com/admin/projects/232/writers/keboola.wr-db-snowflake/402880583 cpu stress test: https://connection.keboola.com/admin/projects/578/transformations/bucket/sys.c-tr-r-transformations/transformation/get-tree-nesting-level-p3

ondrejhlavacek commented 6 years ago

1

příprava custom science php base image

git clone https://github.com/keboola/docker-custom-php /home/deploy/docker-custom-php
sudo docker build /home/deploy/docker-custom-php -t docker-custom-php

příprava custom science builder image

FROM docker-custom-php

RUN git clone -b master --depth 1 https://github.com/keboola/snowflake-optimization /home/ 
RUN composer install

CMD php /home/main.php
sudo docker build /home/deploy/stresstest-01-a -t stresstest-01-a
sudo docker run --volume /home/deploy/stresstest-01-a:/data --volume /tmp/stresstest-01-a:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-01-a stresstest-01-a
ondrejhlavacek commented 6 years ago

2

to nedám, je tam custom snowflake driver

ondrejhlavacek commented 6 years ago

3

příprava image

git clone https://github.com/keboola/r-transformation /home/deploy/r-transformation
sudo docker build /home/deploy/r-transformation -t r-transformation
sudo docker run --volume /home/deploy/stresstest-02-a:/data --volume /tmp/stresstest-02-a:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-02-a r-transformation
ondrejhlavacek commented 6 years ago

Full suite, pouštěno ve screenách

mkdir /tmp/stresstest-01-a
mkdir /tmp/stresstest-01-b
mkdir /tmp/stresstest-01-c
mkdir /tmp/stresstest-01-d

mkdir /tmp/stresstest-02-a
mkdir /tmp/stresstest-02-b
mkdir /tmp/stresstest-02-c
mkdir /tmp/stresstest-02-d

time sudo docker run --volume /home/deploy/stresstest-01-a:/data --volume /tmp/stresstest-01-a:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-01-a stresstest-01-a
time sudo docker run --volume /home/deploy/stresstest-01-b:/data --volume /tmp/stresstest-01-b:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-01-b stresstest-01-b
time sudo docker run --volume /home/deploy/stresstest-01-c:/data --volume /tmp/stresstest-01-c:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-01-c stresstest-01-c
time sudo docker run --volume /home/deploy/stresstest-01-d:/data --volume /tmp/stresstest-01-d:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-01-d stresstest-01-d

time sudo docker run --volume /home/deploy/stresstest-02-a:/data --volume /tmp/stresstest-02-a:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-02-a r-transformation
time sudo docker run --volume /home/deploy/stresstest-02-b:/data --volume /tmp/stresstest-02-b:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-02-b r-transformation
time sudo docker run --volume /home/deploy/stresstest-02-c:/data --volume /tmp/stresstest-02-c:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-02-c r-transformation
time sudo docker run --volume /home/deploy/stresstest-02-d:/data --volume /tmp/stresstest-02-d:/tmp --memory 8192m --memory-swap 8192m --net bridge --cpus 2 --env KBC_DATADIR=/data/ --name stresstest-02-d r-transformation