Если вы используете - net = host
, контейнер совместно использует сетевой стек хоста и все интерфейсы из хост будет доступен для контейнера , ( согласно справочнику по запуску для докера )
Если вы уже предоставили общий доступ ко всему, вам не нужно явно сопоставлять 8777 с 8777. {{1} } На самом деле реализация сопоставления была бы странной: сопоставление 1234 с 8777 заставило бы хост также прослушивать 8777? Вот почему вы не видите назначенных портов.
Просто оставьте - net = host
и попробуйте подключиться на хосте к 8777, он будет соединен с 8777 в контейнере. Убедитесь, что ваш контейнер не зависит от фактического IP-адреса, который он использует. Внешний мир будет видеть только IP-адреса хостов.
Сначала: Создайте скрипт. Вы можете назвать его как угодно. Я назову его downloader.sh
.
#!/bin/bash
PROTOCOL="ftp"
URL="server.example.com"
LOCALDIR="/home/user/downloads"
REMOTEDIR="dir/remote/server/"
USER="user"
PASS="password"
REGEX="*.txt"
LOG="/home/user/script.log"
cd $LOCALDIR
if [ ! $? -eq 0 ]; then
echo "$(date "+%d/%m/%Y-%T") Cant cd to $LOCALDIR. Please make sure this local directory is valid" >> $LOG
fi
lftp $PROTOCOL://$URL <<- DOWNLOAD
user $USER "$PASS"
cd $REMOTEDIR
mget -E $REGEX
DOWNLOAD
if [ ! $? -eq 0 ]; then
echo "$(date "+%d/%m/%Y-%T") Cant download files. Make sure the credentials and server information are correct" >> $LOG
fi
Второе: Добавьте его в crontab. Если вы хотите выполнять его каждые точные 15 минут внутри часа:
45,30,15,00 * * * * /home/user/downloader.sh >/dev/null 2>&1
Если вы хотите выполнять его каждые 15 минут независимо от начальной минуты:
*/15 * * * * /home/user/downloader.sh >/dev/null 2>&1
Объяснение переменных:
PROTOCOL
- Какой протокол использовать. lftp
поддерживает хороший набор из них: ftp, ftps, http, https, hftp, fish, sftp
и file
. https и ftps требуют, чтобы lftp был скомпилирован с поддержкой OpenSSL или GNU TLS. URL
- Имя или IP сервера. Вы можете даже добавить :PORT
в конце, если ваш сервер не использует порт по умолчанию для используемого протокола. LOCALDIR
- место сохранения файлов. REMOTEDIR
- Куда cd
на удаленном сервере, чтобы получить файлы. USER
и PASSWORD
- учетные данные ftp. REGEX
- регулярное выражение для фильтрации файлов для загрузки. Это может быть полезно, если вы хотите загрузить только файлы определенного расширения, например. Используйте *
, если вы хотите скачать все. LOG
- Расположение файла журнала. Объяснение некоторой логики кода:
1. - if
if [ ! $? -eq 0 ]; then
fi
Переменная $?
- это специальная переменная bash, которая означает "код состояния последней команды". Bash всегда возвращает ноль при успешном выполнении команды, поэтому, сравнивая -eq
(равно) с начальным !
(отрицательный) на if
должно быть достаточно, чтобы понять, были ли у cd
и lftp
проблемы во время выполнения. Если вам нужен более точный журнал того, что произошло, вам придется порыться в документации к этим командам.
2. - heredocs
lftp $PROTOCOL://$URL <<- DOWNLOAD
DOWNLOAD
bash heredocs. Это способ сказать "подайте эту команду с этим списком входных данных". Я назвал предельную строку DOWNLOAD
, так что все между <<- DOWNLOAD
и DOWNLOAD
будет введено в lftp
. В интернете можно встретить примеры с символом <<
, но я предпочитаю версию <<-
, поскольку она поддерживает отступы.
3. - команды lftp
user $USER "$PASS"
cd $REMOTEDIR
mget -E $REGEX
Это внутренние команды lftp
, которые означают, соответственно, аутентификацию пользователя с $USER
логином и "$PASS"
паролем, переход на $REMOTEDIR
и массовую загрузку чего-либо с помощью ключевых слов $REGEX
. Вы можете узнать их, просто набрав lftp
, и как только откроется оболочка lftp, введите ?
и нажмите Enter или ? lftp-command-you-want
и нажмите Enter. Пример:
[root@host ~]# lftp
lftp :~> ?
!<shell-command> (commands) alias [<name> [<value>]]
attach [PID] bookmark [SUBCMD] cache [SUBCMD]
cat [-b] <files> cd <rdir> chmod [OPTS] mode file...
close [-a] [re]cls [opts] [path/][pattern] debug [<level>|off] [-o <file>]
du [options] <dirs> exit [<code>|bg] get [OPTS] <rfile> [-o <lfile>]
glob [OPTS] <cmd> <args> help [<cmd>] history -w file|-r file|-c|-l [cnt]
jobs [-v] [<job_no...>] kill all|<job_no> lcd <ldir>
lftp [OPTS] <site> ln [-s] <file1> <file2> ls [<args>]
mget [OPTS] <files> mirror [OPTS] [remote [local]] mkdir [-p] <dirs>
module name [args] more <files> mput [OPTS] <files>
mrm <files> mv <file1> <file2> [re]nlist [<args>]
open [OPTS] <site> pget [OPTS] <rfile> [-o <lfile>] put [OPTS] <lfile> [-o <rfile>]
pwd [-p] queue [OPTS] [<cmd>] quote <cmd>
repeat [OPTS] [delay] [command] rm [-r] [-f] <files> rmdir [-f] <dirs>
scache [<session_no>] set [OPT] [<var> [<val>]] site <site-cmd>
source <file> torrent [-O <dir>] <file|URL>... user <user|URL> [<pass>]
wait [<jobno>] zcat <files> zmore <files>
lftp :~> ? mget
Usage: mget [OPTS] <files>
Gets selected files with expanded wildcards
-c continue, resume transfer
-d create directories the same as in file names and get the
files into them instead of current directory
-E delete remote files after successful transfer
-a use ascii mode (binary is the default)
-O <base> specifies base directory or URL where files should be placed
Знания о том, что mget
будет правильной командой внутри lftp
, пришли из чтения manpages и поиска ключевых слов типа "bulk", "multi" или "mass", и знания того, что в ftp(1)
команде также есть команда mget
, поэтому, вероятно, lftp
будет иметь эквивалент.
Manpage: lftp(1)