要從Azure WebApp管理員連接到我的容器,我需要在啟動時啟動 ssh 服務器。然后我需要在資料庫啟動后運行 Web 服務器。
在我的 Dockerfile 中,我創建了一個專用的非 root 用戶來運行 Web 服務器。
RUN groupadd -g 1000 wagtail && \
useradd -u 1000 wagtail -m -d /home/wagtail -g wagtail
我將腳本復制startup-ssh.sh到容器中:startup-main.sh
COPY startup-ssh.sh /app/
COPY startup-main.sh /app/
RUN chmod x /app/startup-ssh.sh
RUN chmod x /app/startup-main.sh
ENTRYPOINT ["/bin/bash", "-c", "/app/startup-ssh.sh"]
CMD ["/bin/bash", "-c", "/app/startup-main.sh"]
在startup-ssh.sh我啟動 ssh 服務器然后使用gosu切換用戶:
#!/bin/bash
# start ssh server
sed -i "s/SSH_PORT/$SSH_PORT/g" /etc/ssh/sshd_config
/usr/sbin/sshd
# restore /app directory rights
chown -R wagtail:wagtail /app
# switch to the non-root user
exec gosu wagtail "$@"
我希望接下來會執行 CMD 的startup-main.sh腳本,但是當容器啟動時,我會在 Docker 桌面日志中得到它。
Exited(1) Usage: gosu user-spec command [args] gosu nobody:root bash -c 'whoami && id' gosu 1000:1 idie: gosu tianon bash gosu version: 1.10 (go1.11.5 on linux/amd64; gc) license: GPL-3 (full text at https://github.com/tianon/gosu)
我相信 Docker Desktop在連接到容器時使用root 。
也許我錯過了一些關鍵的東西和/或這是顯而易見的。請指點我。
uj5u.com熱心網友回復:
代碼沒有向腳本傳遞任何引數。想象它是這樣的:
bash -c '/app/startup-ssh.sh <NO ARGUMENTS HERE>' ignored ignored2 ignored3...
測驗:
bash -c 'echo' 1
bash -c 'echo' 1 2
bash -c 'echo $0' 1 2 3
bash -c 'echo $1' 1 2 3
bash -c 'echo "$@"' 1 2 3
你要:
ENTRYPOINT ["/bin/bash", "-c", "/app/startup-ssh.sh \"$@\"", "--"]
或者,如果檔案有一個shebang并且是可執行的,為什么要顯式shell,真的只是:
ENTRYPOINT ["/app/startup-ssh.sh"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/515826.html
標籤:重击码头工人
