Fundo
Estou construindo uma imagem baseada no Debian:11. Estou tentando definir o PATH
com /bin/sh
um valor dinâmico determinado em tempo de construção da imagem . (O " no momento da construção da imagem " é importante. Não posso simplesmente incluir uma estática ENV PATH
no meu Dockerfile.)
O problema
Quando corro:
docker build . --tag debian-with-chrome-driver
docker run -it --rm debian-with-chrome-driver
echo $PATH
O resultado real é:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
O resultado desejado é:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
O que eu tentei
Com base em uma variedade de postagens do StackExchange, tentei definir o PATH
seguinte:
/etc/profile
/etc/login.defs
/etc/environment
O seguinte mostra o conteúdo relevante dos arquivos acima:
# tail -n 3 /etc/profile
PATH=${PATH}:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
export PATH
# cat /etc/login.defs | grep chromedriver
ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
# cat /etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
Eu defini com sucesso o caminho para o bash (conforme mostrado a seguir). Mas preciso definir o caminho para o sh.
# bash
root@4e159cfc9fe5:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/chromedriver/linux-119.0.6045.105/chromedriver-linux64
Dockerfile
Você pode tentar você mesmo:
docker build . --tag debian-with-chrome-driver
FROM debian:11
RUN apt-get update && apt-get install -y curl
# from https://github.com/nodesource/distributions#deb
RUN curl -SLO https://deb.nodesource.com/nsolid_setup_deb.sh \
&& chmod 500 nsolid_setup_deb.sh \
&& ./nsolid_setup_deb.sh 21 \
&& apt-get -y install nodejs
# from https://developer.chrome.com/blog/chrome-for-testing/#how-can-i-get-chrome-for-testing-binaries
RUN npx -y @puppeteer/browsers install chrome@stable \
&& npx -y @puppeteer/browsers install chromedriver@stable
# add the chromedriver to the PATH
RUN export CHROME_DRIVER_PATH=$(find /chromedriver -name "chromedriver" -type f -executable -printf "%h" -quit) \
&& export APPEND_CHROME_DRIVER_PATH="PATH="'${PATH}'":${CHROME_DRIVER_PATH}" \
# \
&& echo "export ${APPEND_CHROME_DRIVER_PATH}\n" >> /etc/bash.bashrc \
&& echo "${APPEND_CHROME_DRIVER_PATH}\nexport PATH\n" >> /etc/profile \
# \
&& export CHROME_DRIVER_PATH_ESCAPED=$(echo ${CHROME_DRIVER_PATH} | sed 's/\//\\\//g') \
&& sed -i '/^ENV_SUPATH.*/ s/$/:'"${CHROME_DRIVER_PATH_ESCAPED}"'/' /etc/login.defs \
&& sed -i '/^ENV_PATH.*/ s/$/:'"${CHROME_DRIVER_PATH_ESCAPED}"'/' /etc/login.defs \
# \
&& echo "PATH=${PATH}:${CHROME_DRIVER_PATH}\n" >> /etc/environment \
&& echo ${PATH}
ENTRYPOINT [ "bin/sh" ]
Pois
/bin/sh
no Debian (dash
)/etc/profile
e assim por diante são usados apenas para shells de login. Para shells sem login, você pode especificar um script de inicialização para usar naENV
variável de ambiente. No final do seuDockerfile
: