Ricostruzione del launcher fallisce con Docker 19.03.0 a causa del parametro di rete Docker

Con Docker che ha rilasciato la versione 19.03.0, il launcher di Discourse non riesce più ad avviare l’istanza dopo una ricostruzione, mostrando il seguente messaggio:

/usr/bin/docker: --network non è un indirizzo MAC valido.
Vedi '/usr/bin/docker run --help'.

Questo è il comando eseguito (alcuni elementi modificati per motivi di sicurezza):

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=2 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e DISCOURSE_HOSTNAME=discourse.mydomain.com -e VIRTUAL_HOST=discourse.mydomain.com -e DISCOURSE_DEVELOPER_EMAILS=admin@mydomain.com -e DISCOURSE_SMTP_ADDRESS=mail.mydomain.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=discourse@mydomain.com -e DISCOURSE_SMTP_PASSWORD=MySuperDuperPass -h vps-discourse -e DOCKER_HOST_IP=172.17.0.1 --name discourse -t --expose 80 --mac-address --network reverse-proxy --network reverse-proxy local_discourse/discourse /sbin/boot
/usr/bin/docker: --network non è un indirizzo MAC valido.
Vedi '/usr/bin/docker run --help'.

Sto utilizzando questa configurazione dietro un reverse proxy (in esecuzione sulla rete denominata reverse-proxy). Ha sempre funzionato, fino a oggi. Sembra che ci si aspetti un valore per l’indirizzo MAC che non viene fornito.

Vediamo…

root@endoffice-a:/var/discourse# docker --version
Docker version 19.03.0, build aeac949

Ho appena eseguito ./launcher rebuild app ed è andato a buon fine:

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=8 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e UNICORN_SIDEKIQ_MAX_RSS=1000 -e DISCOURSE_HOSTNAME=discourse.codinghorror.com -e DISCOURSE_DEVELOPER_EMAILS=jatwood@codinghorror.com -e DISCOURSE_SMTP_ADDRESS=smtp.mailgun.org -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME={redacted} -e DISCOURSE_SMTP_PASSWORD={redacted} -e LETSENCRYPT_ACCOUNT_EMAIL={redacted} -e DISCOURSE_CDN_URL=https://discourse-cdn.codinghorror.com -h endoffice-a-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:72:e3:65:d5:32 local_discourse/app /sbin/boot

Nota che --mac-address appare ed è popolato, ma la riga --network è specifica della tua configurazione e si discosta da un’installazione standard standalone di Discourse.

@codinghorror Tutto questo è ottimo, ma allora, se l’installazione standalone standard è l’unico modo in cui Discourse dovrebbe funzionare, perché fornire il supporto per la configurazione del contenitore yml in ./containers e includere esempi di ciò in ./samples? Il file che ho utilizzato è completamente commentato con istruzioni per il funzionamento, in particolare questa sezione:

# eventuali argomenti aggiuntivi per Docker?
# docker_args:

L’unica cosa che sto utilizzando è:

docker_args: "--network reverse-proxy"

Che, ancora una volta, ha funzionato perfettamente per un anno. Quindi, ovviamente, qualcosa è cambiato. Per favore, comprendi che non sto cercando di essere conflittuale (sarebbe piuttosto stupido, dato che sto chiedendo aiuto), ma sto effettivamente cercando di sottolineare che sto utilizzando opzioni rese disponibili tramite gli esempi di Discourse.

Forse, se capissi come viene generato quell’indirizzo MAC, potrei individuare un problema legato a un cambiamento nell’ambiente; è questo che spero.

Vedo questo nel launcher:

     if [ -z "$SKIP_MAC_ADDRESS" ] ; then
      mac_address="--mac-address $($docker_path run $user_args -i --rm -a stdout -a stderr $image /bin/sh -c "echo $hostname | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'")"
     fi

Lo analizzerò per vedere se riesco a capire il problema.

AGGIORNAMENTO: Guardando questo, vedo che posso usare --skip-mac-address. Facendo questo, la mia istanza si avvia senza problemi, quindi sembra che il processo che determina l’indirizzo MAC sia il problema.

Quindi, in sintesi. L’operazione di build ha successo in ogni caso, ma nell’operazione di build (./launcher rebuild myinstance), l’ultimo passaggio di avvio del contenitore fallisce perché l’indirizzo MAC non viene impostato in qualche modo.

Tuttavia, dopo di ciò posso semplicemente eseguire ./launcher start myinstance e si avvia correttamente, e l’indirizzo MAC è presente anch’esso. È strano, tutto qui.

Ho lo stesso problema.
@codinghorror Ecco i passaggi per riprodurre il problema e una soluzione per correggere questa regressione

Passaggi per riprodurre:

  1. Imposta nella configurazione dei container (app):
    docker_args: "--network reverse-proxy"
  2. Ricompila
    ./launcher rebuild app
  3. Vedi l’errore
    /usr/bin/docker: --network non è un indirizzo MAC valido

È un bug introdotto dal commit bfc79e7 (GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub)
merge_user_args viene chiamato da set_template_info, ma set_template_info viene chiamato due volte durante la ricompilazione (run_run e run_bootstrap)
Quindi, invece di avere user_args uguale a $user_args $docker_args, abbiamo $user_args $docker_args $docker_args

Docker non permette di configurare la stessa rete più volte
docker: la rete "reverse-proxy" è specificata più volte

Grazie per il rollback di questo commit o per rendere idempotente merge_user_args

Grazie per il lavoro da detective! :male_detective: @saj sembra che tu abbia firmato quel commit insieme a @deargle

Ecco una patch -

Con questa patch applicata e la chiave docker_args impostata nella definizione del container, il vettore finale degli argomenti di docker run assomiglia a questo:

/usr/bin/docker run --shm-size=512m -d --restart=always -e ... -h saj-launcher-testing-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:07:fa:c6:c4:82 --network foonet local_discourse/app /sbin/boot

Figo! Quindi, sono contento di non aver sognato tutto questo. Grazie a tutti per aver indagato.