Я не делал этого с помощью RSpec, но у меня есть тест Test :: Unit, который делает что-то подобное для загрузки фотографии. Я установил загруженный файл в качестве экземпляра ActionDispatch :: Http :: UploadedFile следующим образом:
test "should create photo" do
setup_file_upload
assert_difference('Photo.count') do
post :create, :photo => @photo.attributes
end
assert_redirected_to photo_path(assigns(:photo))
end
def setup_file_upload
test_photo = ActionDispatch::Http::UploadedFile.new({
:filename => 'test_photo_1.jpg',
:type => 'image/jpeg',
:tempfile => File.new("#{Rails.root}/test/fixtures/files/test_photo_1.jpg")
})
@photo = Photo.new(
:title => 'Uploaded photo',
:description => 'Uploaded photo description',
:filename => test_photo,
:public => true)
end
Нечто похожее может работать и на вас.
Я решил его создающий пользователя в MySQL для IP контейнера:
$ sudo mysql
mysql> создают пользователя 'имя пользователя' '172.17.0.2' определенных 'паролем';
Запрос хорошо, 0 затронутых строк (0,00 секунды)
mysql> предоставляют все полномочия на database_name.* к 'имени пользователя' '172.17.0.2' с опцией предоставления;
Запрос хорошо, 0 затронутых строк (0,00 секунды)
$ sudo энергия/etc/mysql/mysql.conf.d/mysqld.cnf
связывают адресный = 172.17.0.1
$ sudo systemctl mysql.service
перезапуска Тогда на контейнере: jdbc:mysql:// 172.17.0.1 :3306/database_name
существует две проблемы, которые мы должны решить
, первая проблема может быть решена с помощью qoomon's изображение хоста докера , как дано другими ответами.
необходимо будет добавить этот контейнер к той же мостовой схема как другой контейнер так, чтобы можно было получить доступ к нему. Откройте терминал в своем контейнере и удостоверьтесь, что можно проверить с помощью ping-запросов dockerhost
.
bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms
Теперь, более трудная проблема, делая сервис доступным для докера.
Мы можем использовать telnet, чтобы проверить, можем ли мы получить доступ к порту на хосте (Вы, возможно, должны установить это).
проблема состоит в том, что наш контейнер только будет в состоянии к службам доступа, которые связывают со всеми интерфейсами, такими как SSH:
bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
, Но сервисы, связанные только с localhost, будет недоступно:
bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused
надлежащее решение здесь состояло бы в том, чтобы связать сервис с мостовой схема докеров. Однако этот ответ предполагает, что для Вас не возможно изменить это. Таким образом, мы будем вместо этого использовать iptables
.
Первый, мы должны найти название мостовой схема, которую докер использует с ifconfig
. При использовании моста без имени это просто будет docker0
. Однако при использовании именованной сети, у Вас будет мост, запускающийся с [1 111], что докер будет использовать вместо этого. Мой br-5cd80298d6f4
.
, Как только у нас есть название этого моста, мы должны позволить направлять от этого моста до localhost. Это отключено по умолчанию из соображений безопасности:
sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1
Теперь для установки нашего iptables
правило. Так как наш контейнер может только порты доступа на мостовой схема докера, мы собираемся притвориться, что наш сервис на самом деле связывается с портом в этой сети.
, Чтобы сделать это, мы передадим все запросы к [1 114] к [1 115]
iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>
, Например, для моего сервиса на порт 1025
iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
необходимо теперь быть в состоянии получить доступ сервису от контейнера:
bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready